我有以下汇编代码链接到最终的可执行文件。
section .text
global _start
_start: mov eax, 4
mov ebx, 1
mov ecx, mesg
mov edx, 9
int 0x80
mesg db "Kingkong",0xa
我做的下一件事是得到它的十六进制代码
0xb8,0x04,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0xb9,0x76,0x80,0x04,0x08,0xba,0x09,0x00,0x00,0x00,0xcd,0x80,0x4b,0x69,0x6e,0x67,0x6b,0x6f,0x6e,0x67,0x0a
并将其放入另一个程序中,如下所示
section .text
global _start
_start:
db 0xb8,0x04,0x00,0x00,0x00,0xbb,0x01,0x00,0x00,0x00,0xb9,0x76,0x80,0x04,0x08,0xba,0x09,0x00,0x00,0x00,0xcd,0x80,0x4b,0x69,0x6e,0x67,0x6b,0x6f,0x6e,0x67,0x0a
现在,当我组装上述文件并完成objdump
它时,它给了我
08048060 <_start>:
8048060: b8 04 00 00 00 mov $0x4,%eax
8048065: bb 01 00 00 00 mov $0x1,%ebx
804806a: b9 76 80 04 08 mov $0x8048076,%ecx
804806f: ba 09 00 00 00 mov $0x9,%edx
8048074: cd 80 int $0x80
8048076: 4b dec %ebx
8048077: 69 6e 67 6b 6f 6e 67 imul $0x676e6f6b,0x67(%esi),%ebp
804807e: 0a .byte 0xa
在mesg
最终转储中没有看到标签,那么程序如何找出mesg
上述程序中段的地址?
编辑:
好吧,我想在阅读答案后对此添加一个小问题,我可以理解标签不用于实际寻址,而是直接将地址烘焙到代码中,但是如果指定地址,mov $0x8048076,%ecx
那么保证是什么下次加载程序时,它将完全从同一个地址开始......如果我用 C 包装这段代码怎么办?如果我想在另一台具有完全不同内存模式的机器上运行它怎么办?