- 主题:为什么不允许 mov ax, [sp+4] 这样的写法
我在 debug 里面输入
mov ax, [sp+4]
提示出错,但是输入
mov ax, [bp+4]
就没有问题。
bp 寄存器是栈基地址,使用 mov ax, [bp+4] 可以访问到调用者传入的参数这个是没错的。但是如果函数内部没有调用过 push/pop,使用 mov ax, [sp+4] 是不是会更方便一些。
当年为啥不让这个指令变成合法的?
--
FROM 120.230.92.*
对了,当年 c 调用约定应该没啥用吧?
那会儿流行 turbo pascal 和 turbo c/c++,这两个编译器用的啥调用约定?
pascal 还是 fastcall? 当年的程序员会特别挑哪个吗?我猜是 fastcall ?
【 在 hgoldfish 的大作中提到: 】
: 我在 debug 里面输入
: mov ax, [sp+4]
: 提示出错,但是输入
: ...................
--
FROM 120.230.92.*
果然,8086 不允许,但是 386 以后就可以写
mov eax,[esp]
mov eax,[ebp]
两个都允许了。
【 在 BigCarrot 的大作中提到: 】
: 你这是086?
: 最原始的x86(16bit)指令集中寄存器的用法还非常特殊化,看了下16b的ModR/M编码,
: 就是没有[sp+disp]
: ...................
--
FROM 120.230.92.*
为啥?pascal 程序员也需要调用其它语言生成的 .lib 吧?
【 在 BigCarrot 的大作中提到: 】
: pascal程序员从来不挑调用约定
--
FROM 120.230.92.*
也没那么复杂。假设这条指令是 16 位,大概就是前面几位 opcode 是 mov,中间几个位代表寄存器啥的。
按 8086 正常的编码,应该会给四个位是寄存器名称,可以容纳 16 个寄存器名。
【 在 vabc3 的大作中提到: 】
: 之前碰到类似问题搜索过。mov指令对应到cpu上是一条专有指令,并不是的把某个寄存器做什么操作放到哪这么通用的指令。
--
FROM 14.19.7.*
ah, al 这不就两个了 :-)
【 在 BigCarrot 的大作中提到: 】
: 8086哪里来的16个寄存器
--
FROM 183.42.139.*
我看了一下,mov 指令都是一个字节。mov sp 也是。
看后面带的立即数是几位的。mov ax,1 这个得 mov ax 一个字节,立即数 1 两个字节,合计 3 个字节。
【 在 blackoil 的大作中提到: 】
: MOV AL/AH/AX 用得多,有特殊编码对应,节省空间,没记错是2个字节搞定。
--
FROM 117.30.39.*