作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我试图与MASM32保持联系,并对以下内容感到困惑:
我以为方括号用于间接,所以如果我有一个预定义的变量
.data
item dd 42
mov ebx, item
mov ebx, [item]
mov ebx, item
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
mov ebx, [item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
mov ebx, [OFFSET item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
最佳答案
MASM对于具有类型的汇编语言是不常见的。 MASM知道,因为您是如何定义符号item
的,它是DWORD
类型的存储位置。当您将其用作操作数时,您知道(可能)意味着您希望将值存储在该地址上,而不是该地址的值上。因此,不管您使用item
还是[item]
,MASM都假定您是指后者。如果您确实想要商品的地址,则需要使用OFFSET item
。
另一方面,如果您已使用item
将item = 42
定义为常量,则mov ebx, item
将加载立即数。由于存在这种歧义,因此您需要知道如何定义item
以确定它是立即数操作数还是内存操作数,最好避免使用裸符号作为操作数。
我应该补充一点,当您仅使用符号或数字时,方括号[]
对MASM几乎没有任何意义。它们仅在将它们与寄存器一起使用时才有意义。这里有一些例子:
item DD 42
const = 43
mov eax, item ; memory operand (the value stored at item)
mov eax, [item] ; memory operand
mov eax, OFFSET item ; immediate operand (the address of item)
mov eax, [OFFSET item] ; immediate operand
mov eax, const ; immediate operand (43)
mov eax, [const] ; immediate operand
mov eax, ds:[const] ; memory operand (the value at address 43)
mov eax, fs:30h ; memory operand (the value at address 30h + fs base)
mov eax, OFFSET const ; immediate operand
mov eax, [OFFSET const] ; immediate operand
mov eax, 42 ; immediate operand
mov eax, ebx ; register operand (the value of EBX)
mov eax, [ebx] ; indirect operand (the value pointed to by EBX)
OFFSET
与打算用作立即值的符号一起使用。
关于assembly - MASM32中令人困惑的括号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25129743/
我是一名优秀的程序员,十分优秀!