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

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

先开启一个c语言档

$ vim test.c

在档案内输入:

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

方法一

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

输出:

test.o:     file format elf64-x86-64


Disassembly 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, @function
set_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-64


Disassembly 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的意思


<<:  实施入侵检测系统以应对安全事件和基於生物识别的存取控制-纵深防御(Defense-in-depth)

>>:  QUIC.cloud CDN 与 DNS 新手教学

Day 26. Hashicorp Vault: Rate Limit

Hashicorp Vault: Rate Limit 为了保护Vault server避免user...

【DAY 5】主管签名好难追怎麽办? Power Automate - 核准

哈罗 ~ 大家好 ~ 欢迎回来 ~ 相信征战职场的大家,一定会有个苦恼的问题,那就是每次老板签公文都...

Ruby幼幼班--Rotate String

坚持传教K-pop...就可以坚持每天解题?? Rotate String 题目连结:https:...

Day 11 ( 中级 ) 拍手换图案 ( 二代板 )

拍手换图案 ( 二代板 ) 教学原文参考:拍手换图案 ( V2 ) 这篇文章是针对 micro:bi...

Day 0x4 - 请求 API 前的前置动作(Part 1)[Nonce, Hash Id, Sign]

0x1 Nonce 取得 Nonce 为每次发出请求API服务前必须取得的参数之一, 而这个是需要在...