标签表示其后的第一个字节的地址,但是我可以读取它的值吗?例如,我可以执行以下操作吗?
some_label:
mov eax, some_label ; this will move the address of mov into eax?
Run Code Online (Sandbox Code Playgroud)
你展示的内容会起作用nasm,但结果可能不是你所期望的.
关于你所写的内容的更多信息将有助于这个答案更加具体.(典型的用户模式ELF应用程序?独立的二进制blob?还有其他什么?)
因为汇编程序不知道代码可能在哪里运行(在地址空间中),所以您编写的指令将导致汇编程序生成重定位(如果您的输出格式支持它).
如果你的环境确实支持重定位(例如,由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
Run Code Online (Sandbox Code Playgroud)
x86_64指令集添加了一个RIP相对寻址方案,这使得这更容易:
some_lable:
lea rax, [rel some_label]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1397 次 |
| 最近记录: |