Assembly 取消引用x86程序集中的标签
考虑以下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 后续问题: 取消对标签的引用会给我一个地址吗?或者标签中第一个命令的机器代
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
后续问题:
eax
的值是3还是5第一个mov从相对于段寄存器[e]DS的偏移量goo进行复制。第二个mov在foo的偏移量处写入相对于DS寄存器的数据位置。如果CS和DS是重合的,则可以忽略这一点。假设CS和DS是重合的,那么接下来可能会遇到各种保护机制,这些机制将代码段呈现为只读 再次跟进:
mov eax,2
的前4个字节(由于小端编码,它确实被4替换,但随后被下一条指令覆盖,而下一条指令根本没有被修改过-5永远不会作为候选项出现在图片中(我以为您认为代码会按照您第一次提出问题[1]的方式重新排序,尽管您显然知道的更多,正如我应该从您的代表那里猜到的那样:P)])[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
指令。后续回答:
看起来这是正常的,因为它们不是完整的32位量,最后一个字节总是0。如果您尝试mov、eax 0xC000000之类的东西,此代码将失败。对-我考虑的是RISC…感谢您澄清这一点