我试图掌握MASM32,并对以下内容感到困惑:
我认为括号用于间接,所以如果我有一个预定义的变量
.data
item dd 42
Run Code Online (Sandbox Code Playgroud)
然后
mov ebx, item
Run Code Online (Sandbox Code Playgroud)
将'item'的内容,即数字42,放入ebx和
mov ebx, [item]
Run Code Online (Sandbox Code Playgroud)
将'item'的地址,即存储42的地址放入ebx.
但是控制台应用程序中的以下代码:
mov ebx, item
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
mov ebx, [item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)
两次打印42次.要获得"项目"的地址,我似乎需要
mov ebx, [OFFSET item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释MASM中的方括号,或者指出一个很好的参考.
我有一个内存位置,其中包含一个我想要与另一个角色进行比较的角色(并且它不在堆栈的顶部,所以我不能只是pop它).如何引用内存位置的内容以便进行比较?
基本上我如何在语法上做到这一点.
我试着理解x86汇编中的括号.在这个例子中,寄存器ax应该包含X,因为括号代表当前的地址LABEL.
mov ax, [LABEL]
LABEL:
db "X", 0
Run Code Online (Sandbox Code Playgroud)
但我不明白以下两条装配线:
mov al, [ebx]
Run Code Online (Sandbox Code Playgroud)
为什么我需要括号?是因为ebx是32位寄存器还是ax16位?区别在于:
mov al, ebx
Run Code Online (Sandbox Code Playgroud)
或者这个,我不明白为什么我需要括号......
mov [edx], ax
Run Code Online (Sandbox Code Playgroud) 我对 OFFSET 运算符的概念感到相当困惑。根据 Kip R. Irvine 的《x86 处理器汇编语言》一书,他将偏移运算符定义为返回变量与其封闭段开头之间的距离的运算符。他还说偏移运算符返回数据标签的偏移量,它表示标签与数据段开头的距离(以字节为单位)。什么是偏移量?他所说的标签到数据段开头的距离是什么意思?还有,他有没有得出这样的结果:
他声明了三种不同类型的变量:
.data
bVal BYTE ?
wVal WORD ?
dVal DWORD ?
dVal2 DWORD ?
Run Code Online (Sandbox Code Playgroud)
如果 bVal 位于偏移量 00404000(十六进制),则 OFFSET 运算符将返回以下值:
mov esi, OFFSET bVal ;ESI = 00404000h
mov esi, OFFSET wVal ;ESI = 00404001h
mov esi, OFFSET dVal ;ESI = 00404003h
mov esi, OFFSET dVal2 ;ESI = 00404007h
Run Code Online (Sandbox Code Playgroud)
他从哪里得出这些价值观?请帮忙。非常感谢!