Loo*_*gai 1 assembly x86-64 disassembly
.asciix86 汇编中的指令如何工作?什么时候将 ASCII 码放入内存?我假设文本是放置在主内存中的机器代码的一部分,但是这里机器代码的yourText部分到底做了什么?
在 40100e 中, yourText代码部分的开头被放入 write 系统调用的缓冲区参数中。在 CI 中,会将其解释为将指针传递给字符串文字的第一个字符,但我不完全明白为什么它会转到更多代码,而不是在内存中找到文字的位置。
hwa.out: file format elf64-x86-64
Disassembly of section .text:
0000000000401000 <_start>:
401000: 48 c7 c0 01 00 00 00 mov $0x1,%rax
401007: 48 c7 c7 01 00 00 00 mov $0x1,%rdi
40100e: 48 c7 c6 2a 10 40 00 mov $0x40102a,%rsi
401015: 48 c7 c2 0d 00 00 00 mov $0xd,%rdx
40101c: 0f 05 syscall
40101e: 48 c7 c0 3c 00 00 00 mov $0x3c,%rax
401025: 48 31 ff xor %rdi,%rdi
401028: 0f 05 syscall
000000000040102a <yourText>:
40102a: 48 rex.W
40102b: 65 6c gs insb (%dx),%es:(%rdi)
40102d: 6c insb (%dx),%es:(%rdi)
40102e: 6f outsl %ds:(%rsi),(%dx)
40102f: 2c 20 sub $0x20,%al
401031: 57 push %rdi
401032: 6f outsl %ds:(%rsi),(%dx)
401033: 72 6c jb 4010a1 <yourText+0x77>
401035: 64 fs
401036: 0a .byte 0xa
Run Code Online (Sandbox Code Playgroud)
这是在这个问题中找到的代码:Hello world without usinglibraries,组装然后反汇编。
我尝试查找有关说明的信息,但找不到有关rex.W和gs开头的 的信息insb。我可以理解为什么程序想要将数据放入端口 ( ),但对我来说在一行下面进行分支 ( )insb没有意义。我假设使用来自上一条指令的信号。jboutsljb
之后的东西yourText是数据,而不是代码。反汇编程序不知道这一点,并试图将其理解为代码,从而导致无意义的反汇编。您可以使用objdump -s更有用的表示形式查看每个部分中的数据。匹配各个字节,您会发现这只是您的字符串。