本文介绍了汇编中 (sp) 和 [sp] 之间的区别的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 NASM 汇编器时,遇到了一个问题:

I was experimenting with the NASM assembler, when I came across a problem:

mov (sp),bx
mov [sp],bx

第一条指令正确组装而第二条指令没有正确组装,并给我错误:

The first instruction is assembled properly while the second one is not, and gives me the error:

错误:无效的有效地址

这是为什么?两者有什么区别?

Why is this? What's the difference between the two?

推荐答案

(%sp) 将是 AT&T 语法寻址模式.(无效,因为16位寻址模式不能直接使用SP,只有BP|BX + SI|DI NASM x86 16 位寻址模式;这也是 mov [sp], bx 无效的原因.)

(%sp) would be an AT&T syntax addressing mode. (Invalid because 16-bit addressing modes can't use SP directly, only BP|BX + SI|DI NASM x86 16-bit addressing modes; that's also the reason mov [sp], bx is invalid.)

在 NASM 语法中,方括号 [] 表示内存操作数.

In NASM syntax, square brackets [] mean a memory operand.

在 NASM 中,SP 周围的括号 () 就像任何编译时表达式一样被删除,
so mov (sp), bx 汇编为 89DC mov sp,bx. 通过汇编和使用 ndisasm 自己尝试一下> 在输出上.(或者组装成-felf32使用objdump)

In NASM, the parens () around SP are removed just like any compile-time expression,
so mov (sp), bx assembles to 89DC mov sp,bx. Try it yourself by assembling and using ndisasm on the output. (Or assemble into -felf32 and use objdump)

这是两个寄存器之间的移动,覆盖堆栈指针.很可能不是您想要的,并且与使用 mov [bp]、bx 或其他方式存储到内存完全不同.

This is a mov between two registers, overwriting the stack pointer. Very likely not what you want, and totally different from storing to memory with mov [bp], bx or whatever.

在 NASM 中,您可能会在编写诸如 mov ax, (1+3) * 4 之类的内容时使用括号,因此 NASM 的表达式解析器会处理括号,并且显然括号内的寄存器名称不会改变任何东西.

In NASM, you might use parens when writing something like mov ax, (1+3) * 4 so NASM's expression parser handles parens, and apparently having a register name inside parens doesn't change anything.

我只在这个答案的顶部提到了 AT&T 语法,因为那和 Plan9/Go 语法是您通常将寄存器名称放在括号中的唯一时间;它只是在 NASM 语法中令人困惑;不要这样做.

这篇关于汇编中 (sp) 和 [sp] 之间的区别的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-29 05:57