【问题标题】:Understanding Y86了解 Y86
【发布时间】:2016-10-28 18:26:25
【问题描述】:

我有以下代码。有人可以解释一下我在括号中的问题吗?

# Execution begins at address 0 (why?)
.pos 0
irmovq stack, %rsp  # Set up stack pointer  (how can i move the word "stack" in rsp)
call main   # Execute main program
halt    # Terminate program  

# Sample linked list   (what is the purpose of .align 8?)
.align 8
ele1:
.quad 0x00a
.quad ele2
ele2:
.quad 0x0b0
.quad ele3
ele3:
.quad 0xc00
.quad 0

main:
irmovq ele1,%rdi
call sum
ret


sum:


# Stack starts here and grows to lower addresses
.pos 0x100
stack:

【问题讨论】:

    标签: assembly y86


    【解决方案1】:

    .pos <adr> 是更改编译器当前虚拟地址的指令。所以下一条编译的指令将被视为地址<adr>,如果你把<label>放在它前面,<label>的值将是<adr>,因此代码中后面的任何指令都以@987654326的绝对地址运行@ 将使用 <adr> 值编译。

    编译器在编译过程中也会跟踪当前的虚拟地址,所以如果你稍后使用一些<label2>几条指令,它就会有<adr + size_of_produced_machine_code_so_far>的值。

    当您在实际内存中的该位置加载机器代码时,代码中的所有绝对地址都将适合并正常工作(如果您将其加载到其他地方,它将无法正常工作,因为说明仍将引用<adr>,为它们编译)。

    在您的示例中,这意味着一旦将机器代码加载到内存计算机中,第一个 irmovq 将被放置在地址 0

    为什么从地址 0 开始执行?谁知道,那是目标平台的特性。如果目标平台将从 0x300 开始执行,则将启动代码放在那里是有意义的,使用 .pos 0x300 指令。


    irmovq stack, %rsp # Set up stack pointer (how can i move the word "stack" in rsp)

    rsp 被设置为包含stack 符号的地址(实际上是“堆栈”符号的值,在人类逻辑中可以看作是内存地址,但它只是数字,如一切在计算机中),这是0x100 值(因为.pos 指令就在stack: 标签定义之前)。所以该指令执行rsp = 0x100


    .align 8 的目的是什么?

    对齐的意思是调整地址,使其可以被某个数整除而没有余数。在第一种情况下,标签ele1 将具有可被 8 整除的地址。如果前面的机器代码将在某个不可整除的地址处结束,编译器将添加一些字节(通常是 nop-like 指令)来填补空白,直到满足align 要求的下一个可能地址。

    对齐对于内存控制器的性能很重要,因为它们通常在内部使用字节组,例如只能从 8 对齐地址获取四字作为 8 字节。如果您要求它从非对齐地址中获取四字,它将从(address & -8)((address & -8)+8) 中获取两个 8 字节集,并从获取的 16 字节中间读取最后的 8 字节结果。 (在 x86 .. 在其他平台上,未对齐的内存访问甚至可能是无效操作,导致 CPU 接收到陷阱信号,在这种情况下运行崩溃处理程序)。

    (为什么按位与 -8 使地址与 8 对齐?-8 = 0xF..F8 = 0b11...11000 => 最后 3 位设置为零 => 强制被 8 整除)

    【讨论】:

      【解决方案2】:

      执行从0 开始,因为这是.pos 0 在下一行所做的。

      单词“stack”没有被移动:stack它是代码中的一个标签,它将堆栈指针rsp设置为内存中的那个位置。

      对齐到 8 字节边界的目的是因为处理器不会善意地桥接这样的边界。 .quad 指令生成 8 字节数据。

      请求教程是题外话 - 很容易在谷歌上搜索它们并选择您认为适合您的教程。

      【讨论】:

      • 我认为您可能在第一句话中混淆了因果关系,即使用了.pos 0,因为执行从0开始。起始位置,无论是特定的内存地址还是特定的符号,都由底层平台决定,而不是由编写代码的任何人或其他人决定。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-04
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      相关资源
      最近更新 更多