假设我有以下声明:
section .bss
buffer resb 1
而这些说明如下:
mov al, 5
mov [buffer], al
mov bl, [buffer]
mov cl, buffer
我在理解是BL将包含值5改正,CL将包含变量的内存地址buffer
?
我感到困惑之间的差异
- 移动立即到寄存器,
- 移动寄存器到直接(在发生什么,数据或地址?)和
- 移动立即到寄存器没有括号
- 例如,
mov cl, buffer
VS mov cl, [buffer]
更新:阅读的答复后,我想下面的总结是准确的:
假设声明array resb 0
下存在section .bss
。 我的理解是:
-
mov edi, array
放入第零数组索引的存储器地址edi
。 -
mov [edi], 3
把值3到阵列的第零指数 - 后
add edi, 3
, edi
现在包含所述阵列的第三索引的存储器地址 -
mov al, [array]
放DATA第零索引处到al
。 -
mov al, [array+3]
把对DATA第三索引处到al
。 -
mov [al], [array]
是无效的,不管是什么原因。 -
mov array, 3
是无效的,因为你不能说“嘿,我不喜欢它的偏移array
进行存储,因此我称之为3” -
mov [array], 3
把值3到阵列的第零索引。
请注明如果任何这些是假的。
事实上,你的思想是correct.That是,BL将包含5和CL缓冲区的内存地址(实际上标签缓冲是一个内存地址本身)。
现在,让我解释一下你提到的操作之间的差异:
移动立即到寄存器中可使用来完成mov reg,imm
。何可能混淆的是,标记物例如缓冲器是包含一个地址立即值本身。
你真的不能动寄存器到直接,因为眼前的值是常量,像2
或FF1Ah
。什么,你可以做的是移动寄存器其中常数点to.You可以做喜欢的地方mov [const], reg
。
您还可以使用间接寻址像mov reg2,[reg1]
提供REG1指向有效的位置,它会通过转移REG1指出REG2的值。
所以, mov cl, buffer
将移动缓冲区的地址 ,CL(这可能会或可能不会给出正确的地址,因为CL只有一个字节长),而mov cl, [buffer]
将获得的实际值。
摘要
- 当使用并[a],则参考值在其中点to.For例如,如果是的地方
F5B1
,然后并[a]是指在RAM中的地址F5B1。 - 标签是像地址,即值
F5B1
。 - 存储在寄存器中的值没有被引用为[注册],因为寄存器不必addresses.In事实上,寄存器可以被认为是立即值的。
方括号主要工作等(例如,像一个引用操作*
在C)。
所以,像
mov REG, x
移动的值x
到REG
,而
mov REG, [x]
移动的存储器位置的其中值x
点到REG
。 请注意,如果x
是一个标签,它的价值在于标签的地址。
至于你的问题:
我在理解是BL将包含值5改正,CL将包含变量缓冲区的内存地址?
是的,你是对的。 但要注意的是,由于CL
仅宽8位,它将只包含的地址的最低显著字节buffer
。
对于使用立即值作为操作数为写值到RAM的位置(或内计算)的所有指令,我们必须指定我们要多少字节访问。 因为我们的装配不知道,如果我们想进入只有一个字节 ,一个字 ,或例如doppleword如果立即值较低的值,如下面的说明所示。
array db 0FFh, 0FFh, 0FFh, 0FFh
mov byte [array], 3
结果:
array db 03h, 0FFh, 0FFh, 0FFh
....
mov word [array], 3
结果:
array db 03h, 00h, 0FFh, 0FFh
....
mov dword [array], 3
结果:
array db 03h, 00h, 00h, 00h
短剑