基本使用x86汇编和YASM立即数(方括号)的基本使用x86汇编和YASM立即数(方括号)的(Bas

2019-05-13 16:42发布

假设我有以下声明:

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, 3edi现在包含所述阵列的第三索引的存储器地址
  • mov al, [array]放DATA第零索引处到al
  • mov al, [array+3]把对DATA第三索引处到al
  • mov [al], [array]是无效的,不管是什么原因。
  • mov array, 3是无效的,因为你不能说“嘿,我不喜欢它的偏移array进行存储,因此我称之为3”
  • mov [array], 3把值3到阵列的第零索引。

请注明如果任何这些是假的。

Answer 1:

事实上,你的思想是correct.That是,BL将包含5和CL缓冲区的内存地址(实际上标签缓冲是一个内存地址本身)。


现在,让我解释一下你提到的操作之间的差异:

  • 移动立即到寄存器中可使用来完成mov reg,imm 。何可能混淆的是,标记物例如缓冲器是包含一个地址立即值本身。

  • 你真的不能动寄存器到直接,因为眼前的值是常量,像2FF1Ah 。什么,你可以做的是移动寄存器其中常数点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事实上,寄存器可以被认为是立即值的。


Answer 2:

方括号主要工作等(例如,像一个引用操作*在C)。

所以,像

mov REG, x

移动的值xREG ,而

mov REG, [x]

移动的存储器位置的其中值x点到REG 。 请注意,如果x是一个标签,它的价值在于标签的地址。

至于你的问题:

我在理解是BL将包含值5改正,CL将包含变量缓冲区的内存地址?

是的,你是对的。 但要注意的是,由于CL仅宽8位,它将只包含的地址的最低显著字节buffer



Answer 3:

你得到的想法。 不过,也有值得铭记的几个细节:

  1. 地址可以和通常比什么8位可以保持(大于cl的8位, cx是16位, ecx是32位, rcx是64位)。 因此, cl很可能将是不等于变量的地址buffer 。 它只会有地址的最低显著8位。
  2. 如果有中断程序或线程能够抢占上面的代码和/或访问buffer ,在值bl可以从5.分拆中断程序时它们不能保存寄存器值不同实际上可能影响任何寄存器。


Answer 4:

对于使用立即值作为操作数为写值到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

短剑



文章来源: Basic use of immediates (square brackets) in x86 Assembly and yasm