gpt4 book ai didi

assembly - MASM32中令人困惑的括号

转载 作者:行者123 更新时间:2023-12-04 10:17:53 24 4
gpt4 key购买 nike

我试图与MASM32保持联系,并对以下内容感到困惑:

我以为方括号用于间接,所以如果我有一个预定义的变量

 .data
item dd 42

然后
 mov ebx, item

会将“item”的内容(即数字42)放入ebx和
 mov ebx, [item]

会将“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

打印两次42。要获得“商品”的地址,我似乎需要
 mov ebx, [OFFSET item]
invoke dwtoa, ebx, ADDR valuestr
invoke StdOut, ADDR valuestr

任何人都可以解释一下MASM中的方括号是什么,还是给我一个很好的引用。

最佳答案

MASM对于具有类型的汇编语言是不常见的。 MASM知道,因为您是如何定义符号item的,它是DWORD类型的存储位置。当您将其用作操作数时,您知道(可能)意味着您希望将值存储在该地址上,而不是该地址的值上。因此,不管您使用item还是[item],MASM都假定您是指后者。如果您确实想要商品的地址,则需要使用OFFSET item

另一方面,如果您已使用itemitem = 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com