首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >(sp)与[sp]在装配中的差异

(sp)与[sp]在装配中的差异
EN

Stack Overflow用户
提问于 2020-01-07 13:49:00
回答 1查看 916关注 0票数 1

我在用NASM汇编器做实验时,遇到了一个问题:

代码语言:javascript
运行
复制
mov (sp),bx
mov [sp],bx

第一条指令是正确组装的,而第二条则不是,并给出了错误:

错误:无效有效地址

为什么会这样呢?这两者有什么区别?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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语法中混淆;不要这样做。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59629710

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档