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