前言
很多时候需要对照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"