Skip to content

汇编指令

寄存器

  • 中央处理器用来暂存...存储器,存储量有限,读写速度快
    • 指令
    • 数据
    • 地址

常见汇编指令

  • 寄存器类
    • 通用寄存器 EAX、EBX、ECX、EDX:是 ax,bx,cx,dx 的延伸,各为 32 位
      • AH&AL=AX 累加寄存器(accumulator)
      • BH&BL=BX 基址寄存器(base)
      • CH&CL=CX 计数寄存器(count)
      • DH&DL=DX 数据寄存器(data)
    • 特殊功能寄存器 ESP、EBP、ESI、EDI、EIP:是 sp,bp,si,di,ip 的延伸,32 位
      • SP stack pointer 堆栈指针寄存器 esp
      • BP base pointer 基址指针寄存器 ebp
      • SI source index 源变址寄存器
      • DI destination index 目的变址寄存器
      • IP instruction pointer 指令指针寄存器
    • 段寄存器
      • CS code segment 代码段寄出去
      • DS data segment 数据段寄存器
      • SS stack segment 堆栈段寄存器
      • ES extra segment 附加段寄出去
    • 标志寄存器
      • FR flag register
      • OF overflow flag
      • ZF zero flag
      • PF partity lfag
      • ...
  • 命令类
    • 通用
      • MOV move 传送字或字节
      • MOVSX extended move with sign data 先符号扩展,再传送
      • MOVZX extended move with zero data 先零扩展,再传送
      • PUSH push 把字压入堆栈
      • POP pop 把字弹出堆栈
      • ....
    • 输入输出端口传送指令
      • IN input I/O 端口输入
      • OUT output I/O 端口输出
    • 目的地址传送指令
      • LEA load effective address 装入有效地址
      • LDS load DS 传送目标指针,把指针内容转入 DS
    • 标志传送指令
      • LAHF load AH from flag 标志寄存器传送
  • 算术运算指令
    • ADD 加法
    • ADC 带进位加法
    • INC +1
    • ...
  • 逻辑运算指令
    • AND and &
    • OR or |
    • XOR ~
    • NOT ^
  • 串指令
    • MOVS move string 串传送
    • CMPS 串比较
  • 程序转移指令
    • 无条件转移指令(长指令)
      • JMP jump 无条件转移指令
      • CALL call 过程调用
      • RET return 过程返回
      • RETF return far 过程返回
    • 条件转移指令
      • JAE jump when above or equal 不小于时转移
      • JNB
      • ...
    • 循环控制指令
      • LOOP loop CS 不为零时循环
      • LOOPE loop equal CX 不为零,且结果相等时循环
      • ...
    • 中断指令
      • INT interrupt EXC 为零时转移
      • INTO overflow interrupt 溢出中断
      • IRET interrupt return 中断返回
    • 处理器控制指令
      • HLT halt 处理器暂停,直到出现中断或者复位信号才继续
      • WAIT wait 当芯片引线 TEST 为高电平是 CPU 进入等待状态
      • ESC 切换到外处理器
      • LOCK 封锁总线
      • NOP 空操作
      • STC set carry 置进位标识位
      • ...
  • 伪指令
    • DW definew word 定义字
    • PROC 定义过程
    • ENDP 过程借宿
    • SEGMENT 定义段
    • ASSUME 建立段寄存器寻址
    • ENDS end segment 段结束
    • END end 程序结束

汇编长什么样子

bash
gcc -S test.c

gcc -o a test.c
objdump -S a
  • %rbp 是栈帧指针,用于标识当前栈帧的起始位置
  • %rdi, %rsi, %rdx, %rcx,%r8, %r9 六个寄存器用于存储函数调用时的 6 个参数(如果有 6 个或 6 个以上参数的话)
asm
_main:
100000f40:	55 	pushq	%rbp
100000f41:	48 89 e5 	movq	%rsp, %rbp
100000f44:	48 83 ec 20 	subq	$32, %rsp
100000f48:	c7 45 fc 00 00 00 00 	movl	$0, -4(%rbp)
100000f4f:	c7 45 f8 03 00 00 00 	movl	$3, -8(%rbp)
100000f56:	c7 45 f4 04 00 00 00 	movl	$4, -12(%rbp)
100000f5d:	8b 45 f8 	movl	-8(%rbp), %eax
100000f60:	03 45 f4 	addl	-12(%rbp), %eax
100000f63:	89 45 f0 	movl	%eax, -16(%rbp)
100000f66:	8b 75 f0 	movl	-16(%rbp), %esi
100000f69:	48 8d 3d 36 00 00 00 	leaq	54(%rip), %rdi
100000f70:	b0 00 	movb	$0, %al
100000f72:	e8 0d 00 00 00 	callq	13 <dyld_stub_binder+0x100000f84>
100000f77:	31 f6 	xorl	%esi, %esi
100000f79:	89 45 ec 	movl	%eax, -20(%rbp)
100000f7c:	89 f0 	movl	%esi, %eax
100000f7e:	48 83 c4 20 	addq	$32, %rsp
100000f82:	5d 	popq	%rbp
100000f83:	c3 	retq