Assembly 取消引用x86程序集中的标签

Assembly 取消引用x86程序集中的标签,assembly,x86,Assembly,X86,考虑以下x86汇编代码: section .data foo: mov ebx, [boo] mov [goo], ebx goo: mov eax, 2 mov eax, 3 ret boo: mov eax, 4 mov eax, 5 ret 这到底是怎么回事?当我将[boo]和mov解引用到[goo]时,我到底在移动什么?只要一个命令?还有ret 后续问题: 取消对标签的引用会给我一个地址吗?或者标签中第一个命令的机器代

考虑以下x86汇编代码:

section .data

foo:
    mov ebx, [boo]
    mov [goo], ebx
goo:
    mov eax, 2
    mov eax, 3
    ret
boo:
    mov eax, 4
    mov eax, 5
    ret
这到底是怎么回事?当我将
[boo]
mov
解引用到
[goo]
时,我到底在移动什么?只要一个命令?还有
ret


后续问题:

  • 取消对标签的引用会给我一个地址吗?或者标签中第一个命令的机器代码
  • 如果它是一个机器代码-它怎么可能是多个命令?难道不是所有的命令本质上都是32位的(即使不是所有的位都被使用)
  • 底线-在末尾,
    eax
    的值是3还是5

  • 第一个mov从相对于段寄存器[e]DS的偏移量goo进行复制。第二个mov在foo的偏移量处写入相对于DS寄存器的数据位置。如果CS和DS是重合的,则可以忽略这一点。假设CS和DS是重合的,那么接下来可能会遇到各种保护机制,这些机制将代码段呈现为只读

    再次跟进:

  • 一个标签不像是一个参考,你不能这样取消参考。汇编程序替换一个表示结果代码中位置的数字。您可以加载地址,也可以加载地址处的内容。[和]表示取消引用-我在第一次响应中修复了一个令人困惑的元素来涵盖这一点。Low doing[咕咕]在那个地址装东西
  • 像x86这样的CISC指令集具有[非常]可变长度的指令,有些甚至不是字长的倍数。RISC处理器通常会尝试这样做,以简化解码指令
  • 3-您只修改了
    mov eax,2
    的前4个字节(由于小端编码,它确实被4替换,但随后被下一条指令覆盖,而下一条指令根本没有被修改过-5永远不会作为候选项出现在图片中(我以为您认为代码会按照您第一次提出问题[1]的方式重新排序,尽管您显然知道的更多,正如我应该从您的代表那里猜到的那样:P)])
  • 注意,所有这些都假设CS=DS和DEP没有介入

    此外,如果您使用BX而不是EBX,那么您所期望的事情也会起作用(使用xX而不是ExX访问寄存器的低位2字节[而xL访问低位字节])


    [1] 请记住,汇编程序纯粹是一种编写操作码的工具——标签等东西。所有这些东西都可以归结为数字等。代码几乎没有什么神奇或令人印象深刻的转换——里面没有闭包或任何深奥的东西。(这有点过于简单化-代码可以重新定位,并且在许多情况下,通过链接器和加载程序的组合将修正应用于偏移量的使用)

    boo
    是指令
    mov eax,3
    内部部分
    .data
    的偏移量。
    mov-ebx,[boo]
    表示“在
    ebx
    内以
    boo
    指示的偏移量获取四个字节”。 同样,
    mov[goo],ebx
    将在
    goo
    指示的偏移处移动ebx的内容

    然而,代码通常是只读的,因此看到代码崩溃也就不足为奇了

    以下是
    boo
    处指令的编码方式:

    boo:
    b8 03 00 00 00          mov    eax,0x3
    c3                      ret
    
    因此,您在
    ebx
    中得到的实际上是
    mov-eax的4/5,3
    指令。

    后续回答:

  • 它给出从地址开始的机器代码。其中的多少取决于加载的长度,在本例中为4字节

  • 它可以是多个命令,也可以是一个命令的一个片段。在此体系结构(英特尔x86)上,机器代码命令介于8位和120位之间

  • 三,


  • 看起来这是正常的,因为它们不是完整的32位量,最后一个字节总是0。如果您尝试mov、eax 0xC000000之类的东西,此代码将失败。对-我考虑的是RISC…感谢您澄清这一点