如何解释 x86 汇编中“.ascii”指令生成的代码?

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.Wgs开头的 的信息insb。我可以理解为什么程序想要将数据放入端口 ( ),但对我来说在一行下面进行分支 ( )insb没有意义。我假设使用来自上一条指令的信号。jboutsljb

fuz*_*fuz 7

之后的东西yourText是数据,而不是代码。反汇编程序不知道这一点,并试图将其理解为代码,从而导致无意义的反汇编。您可以使用objdump -s更有用的表示形式查看每个部分中的数据。匹配各个字节,您会发现这只是您的字符串。