我在用NASM汇编器做实验时,遇到了一个问题:
mov (sp),bx
mov [sp],bx
第一条指令是正确组装的,而第二条则不是,并给出了错误:
错误:无效有效地址
为什么会这样呢?这两者有什么区别?
发布于 2020-01-07 14:09:25
(%sp)
将是AT&T语法寻址模式。(无效,因为16位寻址模式不能直接使用SP,只有BP|BX + SI|DI
NASM x86 16-bit addressing modes;这也是mov [sp], bx
无效的原因。)
在NASM语法中,方括号[]
表示内存操作数。
在NASM中,SP周围的父类()
就像任何编译时表达式一样被删除,
因此,mov (sp), bx
组装到 89DC mov sp,bx
**.**,通过在输出上组装和使用ndisasm
来自己尝试。(或汇编成-felf32
并使用objdump
)
这是两个寄存器之间的一个mov,覆盖堆栈指针。很可能不是您想要的,而且与使用mov [bp], bx
或其他任何东西存储到内存完全不同。
在NASM中,您可以在编写类似mov ax, (1+3) * 4
的东西时使用parens,这样NASM的表达式解析器就可以处理parens,而且显然在parens中有一个寄存器名不会改变任何事情。
我只在这个答案的顶部提到AT&T语法,因为这和Plan9/Go语法是唯一一次在父类中放置寄存器名;它只是在NASM语法中混淆;不要这样做。
https://stackoverflow.com/questions/59629710
复制相似问题