我可以在汇编中读取标签值吗?

时间:2014-12-30 11:23:14

标签: assembly x86

标签表示其后的第一个字节的地址,但是我可以读取它的值吗?例如,我可以执行以下操作吗?

some_label:
    mov eax, some_label    ; this will move the address of mov into eax?

1 个答案:

答案 0 :(得分:5)

您展示的内容将适用于nasm,但结果可能不是您所期望的。

关于你所写内容的更多信息将有助于这个答案更具体。 (典型的用户模式ELF应用程序?独立的二进制blob?还有什么?)

因为汇编程序不知道代码可能在哪里运行(在地址空间中),所以您编写的指令将导致汇编程序生成重定位(如果您的输出format支持它。)

如果您的环境确实支持重定位(例如nasm -f elf生成的ELF目标文件),那么应该没问题; eax将匹配执行该指令之前的eip。这是有效的,因为该指令由加载器修复 - 应用了重定位。

如果您的环境支持重定位(例如原始二进制文件或其他非托管环境),那么您就遇到了问题。如果该指令位于二进制blob中的偏移量0x100处,则eax将获得值0x100 - 当然不是您正在执行的实际地址。要解决这个问题,您需要自己进行重新定位。不幸的是,在x86(32位)上没有简单的方法可以做到这一点。你必须做这样的事情:

    call .getbase
.getbase:
    pop ebx
    sub ebx, .getbase

    ;; Now ebx has the base address of your linked application/blob

some_label:
    mov eax, some_label
    add eax, ebx

    ;; Now eax has the (run-time) address of some_label

x86_64指令集添加了一个RIP相对寻址方案,这使得这更容易:

some_lable:
    lea rax, [rel some_label]