前言
很多時候需要對照C和匯編進行分析和調試,所以需要查閱匯編代碼,以下分享幾種方式。
使用網頁
可以進入如下網站輸入C查看對應的匯編,右側可以選擇編譯器版本
使用工具
推薦ripes項目
參考https://mp.weixin.qq.com/s/tcG7yCYMsDzUIQmwL-e6BQ
使用GCC
可以用GCC生成匯編代碼,或者從目標文件,可執行文件中dump出匯編指令
比如有源碼main.c
int add(int a,int b)
{
return a+b;
}
int main(void)
{
int a=0;
int b=1;
int c=1;
a=add(b,c);
return 0;
}
編譯生成匯編
riscv64-unknown-elf-gcc -S -o mian.s main.c
main.s如下
.file "main.c"
.option nopic
.attribute arch, "rv64i2p0_m2p0_a2p0_f2p0_d2p0_c2p0"
.attribute unaligned_access, 0
.attribute stack_align, 16
.text
.align 1
.globl add
.type add, @function
add:
addi sp,sp,-32
sd s0,24(sp)
addi s0,sp,32
mv a5,a0
mv a4,a1
sw a5,-20(s0)
mv a5,a4
sw a5,-24(s0)
lw a4,-20(s0)
lw a5,-24(s0)
addw a5,a4,a5
sext.w a5,a5
mv a0,a5
ld s0,24(sp)
addi sp,sp,32
jr ra
.size add, .-add
.align 1
.globl main
.type main, @function
main:
addi sp,sp,-32
sd ra,24(sp)
sd s0,16(sp)
addi s0,sp,32
sw zero,-20(s0)
li a5,1
sw a5,-24(s0)
li a5,1
sw a5,-28(s0)
lw a4,-28(s0)
lw a5,-24(s0)
mv a1,a4
mv a0,a5
call add
mv a5,a0
sw a5,-20(s0)
li a5,0
mv a0,a5
ld ra,24(sp)
ld s0,16(sp)
addi sp,sp,32
jr ra
.size main, .-main
.ident "GCC: (GNU) 10.2.0"