汇编入门

生成汇编代码 gcc -S
只生成.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



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值