我想知道这些说明之间的区别是:
MOV AX, [TABLE-ADDR]
和
LEA AX, [TABLE-ADDR]
给出以下代码:
L1     db    "word", 0
       mov   al, [L1]
       mov   eax, L1
括号([L1])代表什么?
假设我声明了以下内容:
section .bss
buffer    resb     1
这些说明如下:
mov    al, 5                    ; mov-immediate
mov    [buffer], al             ; store
mov    bl, [buffer]             ; load
mov    cl, buffer               ; mov-immediate?
我是否理解bl将包含值5,并且cl将包含变量的内存地址section .text?
我对两者之间的差异感到困惑
buffervsmov cl, buffer  更新:阅读回复后,我认为以下摘要是准确的:
假设声明mov cl, [buffer]存在于mov edi, array.我的理解是:
edi将第0个数组索引的内存地址放入mov byte [edi], 3.add edi, 3 将VALUE 3放入数组的第0个索引中edi,mov al, [array]现在包含数组第3个索引的内存地址al将DATA置于第零个索引中mov al, [array+3].al将DATA放在第三个索引处mov [al], …我正在尝试学习汇编(所以忍受我),我在这一行得到了一个编译错误:
mov byte [t_last], [t_cur]
错误是
error: invalid combination of opcode and operands
我怀疑这个错误的原因只是因为一个mov指令不可能在两个内存地址之间移动,但是半小时的谷歌搜索并且我无法确认这一点 - 是这样的吗?
另外,假设我是对的,这意味着我需要使用寄存器作为复制内存的中间点:
mov cl, [t_cur]
mov [t_last], cl
什么是推荐使用的寄存器(或者我应该使用堆栈)?
我试图掌握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中的方括号,或者指出一个很好的参考.
我想知道这是否允许组装
 movl (%edx) (%eax) 
我猜想它会访问第一个操作数的内存,然后放入第二个操作数的内存,类似* a = * b,但是我没有看到任何处理此类的示例,因此我猜想它是不允许的。另外,有人告诉我这是不允许的
 leal %esi (%edi)
这是为什么?最后,还有其他类似的功能我不应该被禁止。
在汇编中,方括号似乎与C编程语言中的[]含义相同。它们用于取消引用指针。取消引用指针意味着要引用特定的内存位置来读取或写入它。*
因此,在 a 的情况下使用方括号是非常合乎逻辑的MOV。但他们也将其用于 LEA 的逻辑原因是什么?
LEA EAX, [EBP -4],看起来像取消引用指针,EBP - 4,以引用指向的内存位置,但它不会读取该位置中包含的值,而是读取地址。
我对此有点困惑。你能给我正确的思考方式吗?与取消引用的概念有任何联系
吗?LEA显然不是为了读取内存,而是主要指代内存位置,不是为了它的值,而是为了它的地址。我不希望这成为一个哲学问题。