当使用gcc -S选项编译C程序时,数组中的这个字符串如何用汇编表示?

Yee*_*zus 1 c assembly gcc

这是一个C程序,已经编译成汇编使用gcc -S.字符串"Hello,world"如何在此程序中表示?

这是C代码:

1.        #include <stdio.h>
2.        
3.        int main(void) {
4.        
5.            char st[] = "Hello, wolrd";
6.            printf("%s\n", st);
7.
8.            return 0;
9.       }
Run Code Online (Sandbox Code Playgroud)

下面是汇编代码:

1.        .intel_syntax noprefix
2.        .text
3.        .globl  main
4.
5. main:
6.         push    rbp
7.         mov     rbp, rsp
8.         sub     rsp, 32
9.         mov     rax, QWORD PTR fs:40
10         mov     QWORD PTR [rbp-8], rax
11.        xor     eax, eax
12.        movabs  rax, 8583909746840200520
15.        mov     QWORD PTR [rbp-32], rax
14.        mov     DWORD PTR [rbp-24], 1684828783
15.        mov     BYTE PTR [rbp-20], 0
16.        lea     rax, [rbp-32]
17.        mov     rdi, rax
18.        call    puts
19.        mov     eax, 0
20.        mov     rdx, QWORD PTR [rbp-8]
21.        xor     rdx, QWORD PTR fs:40
22        je      .L3
22.        call    __stack_chk_fail
23.  .L3:
24.        leave
25.        ret
Run Code Online (Sandbox Code Playgroud)

chq*_*lie 6

您正在函数中使用本地缓冲区main,从字符串文字初始化.编译器将此初始化编译为将[rbp-32]3个mov指令设置为16个字节.第一个是via rax,第二个是immediate,值是32位,第三个是单个字节.

8583909746840200520十进制是0x77202c6f6c6c6548十六进制,对应"Hello, W"于小端顺序的字节,16848287830x646c726f,字节"orld".第三个mov设置最后一个'\0'字节.因此缓冲区包含"Hello,World".

然后将此字符串传递给puts输出stdout.

需要注意的是gcc优化了通话printf("%s\n", "Hello, World");puts("Hello, World");!顺便说一句,clang执行相同的优化.