- 主题:为什么不允许 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.*
你这是086?
最原始的x86(16bit)指令集中寄存器的用法还非常特殊化,看了下16b的ModR/M编码,
就是没有[sp+disp]
32b以后又增加了SIB byte,在寻址上寄存器的用法已经很通用化了
【 在 hgoldfish 的大作中提到: 】
: 我在 debug 里面输入
: mov ax, [sp+4]
: 提示出错,但是输入
: ...................
--
FROM 107.204.171.*
pascal程序员从来不挑调用约定
【 在 hgoldfish 的大作中提到: 】
: 对了,当年 c 调用约定应该没啥用吧?
: 那会儿流行 turbo pascal 和 turbo c/c++,这两个编译器用的啥调用约定?
: pascal 还是 fastcall? 当年的程序员会特别挑哪个吗?我猜是 fastcall ?
: ...................
--
FROM 107.204.171.*
果然,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.*
其他语言生成的lib不是pascal程序员能决定的
而且绝大多数程序员不去做跨语言编程的
少部分程序员会把相应的库封装成适合该语言调用的库
比如做一个pascal的unit去调用c语言的库
其他pascal程序员调用这个unit就行了
【 在 hgoldfish 的大作中提到: 】
: 为啥?pascal 程序员也需要调用其它语言生成的 .lib 吧?
--
FROM 107.204.171.*
之前碰到类似问题搜索过。mov指令对应到cpu上是一条专有指令,并不是的把某个寄存器做什么操作放到哪这么通用的指令。
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 果然,8086 不允许,但是 386 以后就可以写
:
: mov eax,[esp]
: mov eax,[ebp]
--
FROM 114.86.198.*
也没那么复杂。假设这条指令是 16 位,大概就是前面几位 opcode 是 mov,中间几个位代表寄存器啥的。
按 8086 正常的编码,应该会给四个位是寄存器名称,可以容纳 16 个寄存器名。
【 在 vabc3 的大作中提到: 】
: 之前碰到类似问题搜索过。mov指令对应到cpu上是一条专有指令,并不是的把某个寄存器做什么操作放到哪这么通用的指令。
--
FROM 14.19.7.*
8086哪里来的16个寄存器
【 在 hgoldfish 的大作中提到: 】
: 也没那么复杂。假设这条指令是 16 位,大概就是前面几位 opcode 是 mov,中间几个位代表寄存器啥的。
: 按 8086 正常的编码,应该会给四个位是寄存器名称,可以容纳 16 个寄存器名。
--
FROM 107.204.171.*