在linux中看gcc产生出来的组合语言

环境:linux使用者直接用终端机即可,windows使用者可用WSL或是建一个linux的虚拟机

先开启一个c语言档

$ vim test.c

在档案内输入:

void set_to_87(int *p){    *p = 87;}

方法一

先产生一个object file(2进位的格式)
gcc -Og -c test.c 
再用objdump去观看组合言(解读2进位的test.o,转换成文字)
objdump -d test.o

输出:

test.o:     file format elf64-x86-64Disassembly of section .text:0000000000000000 <set_to_87>:   0:   c7 07 57 00 00 00       movl   $0x57,(%rdi)   6:   c3                      retq   

方法二

直接让gcc产生出组合语言:

gcc -Og -S test.c 

这时会产生出test.s(文字档)

cat test.s

输出

        .file   "test.c"        .text        .globl  set_to_87        .type   set_to_87, @functionset_to_87:.LFB0:        .cfi_startproc        movl    $87, (%rdi)        ret        .cfi_endproc.LFE0:        .size   set_to_87, .-set_to_87        .ident  "GCC: (Debian 10.2.1-6) 10.2.1 20210110"        .section        .note.GNU-stack,"",@progbits

解读组合语言

void set_to_87(int *p){    *p = 87;}
test.o:     file format elf64-x86-64Disassembly of section .text:0000000000000000 <set_to_87>:   0:   c7 07 57 00 00 00       movl   $0x57,(%rdi)   6:   c3                      retq   

可以看到指令只有两个,这个functio被呼叫时,p的值会放在register%rdi

movl   $0x57,(%rdi)

就是把0x57(87)放到%rdi所指向的记忆体位置的意思

retq

则是return的意思


关于作者: 网站小编

码农网专注IT技术教程资源分享平台,学习资源下载网站,58码农网包含计算机技术、网站程序源码下载、编程技术论坛、互联网资源下载等产品服务,提供原创、优质、完整内容的专业码农交流分享平台。

热门文章