这是一个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)
您正在函数中使用本地缓冲区main,从字符串文字初始化.编译器将此初始化编译为将[rbp-32]3个mov指令设置为16个字节.第一个是via rax,第二个是immediate,值是32位,第三个是单个字节.
8583909746840200520十进制是0x77202c6f6c6c6548十六进制,对应"Hello, W"于小端顺序的字节,1684828783是0x646c726f,字节"orld".第三个mov设置最后一个'\0'字节.因此缓冲区包含"Hello,World".
然后将此字符串传递给puts输出stdout.
需要注意的是gcc优化了通话printf("%s\n", "Hello, World");来puts("Hello, World");!顺便说一句,clang执行相同的优化.