生成汇编代码 gcc -S
只生成.o文件 gcc -c
反编译 objdump -d (mac otool -tv)
汇编代码里所有以.开头的信息可以忽略
常数 $-577
寄存器 %eax
mov 不可以直接从存储器到存储器
push pop %esp保存栈指针
%ebp 帧指针
%eax 常常用来传递返回值
只生成.o文件 gcc -c
反编译 objdump -d (mac otool -tv)
汇编代码里所有以.开头的信息可以忽略
汇编代码后缀表示操作数的大小 b(byte)8 w(word)16 l(double words)32 q(quad words)64
cpu寄存器结构
操作数表示可以有三种方式: 常数 寄存器 存储器常数 $-577
寄存器 %eax
存储器引用 见表里面
操作数表示方法
mov 不可以直接从存储器到存储器
push pop %esp保存栈指针
%ebp 帧指针
%eax 常常用来传递返回值
代码示例
c++代码
int sum(int x, int y) {
int res = x + y;
return res;
}
int main() {
int res = 0;
int x = 3;
int y = 4;
res = sum(x, y);
return 0;
}
汇编代码
.section __TEXT,__text,regular,pure_instructions
.globl __Z3sumii
.align 4, 0x90
__Z3sumii: ## @_Z3sumii
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp2:
.cfi_def_cfa_offset 16
Ltmp3:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp4:
.cfi_def_cfa_register %rbp
movl %edi, -4(%rbp)
movl %esi, -8(%rbp)
movl -4(%rbp), %esi
addl -8(%rbp), %esi
movl %esi, -12(%rbp)
movl -12(%rbp), %eax
popq %rbp
ret
.cfi_endproc
.globl _main
.align 4, 0x90
_main: ## @main
.cfi_startproc
## BB#0:
pushq %rbp
Ltmp7:
.cfi_def_cfa_offset 16
Ltmp8:
.cfi_offset %rbp, -16
movq %rsp, %rbp
Ltmp9:
.cfi_def_cfa_register %rbp
subq $16, %rsp
movl $0, -4(%rbp)
movl $0, -8(%rbp)
movl $3, -12(%rbp)
movl $4, -16(%rbp)
movl -12(%rbp), %edi
movl -16(%rbp), %esi
callq __Z3sumii
movl $0, %esi
movl %eax, -8(%rbp)
movl %esi, %eax
addq $16, %rsp
popq %rbp
ret
.cfi_endproc
.subsections_via_symbols