Appearance
汇编指令
寄存器
- 中央处理器用来暂存...存储器,存储量有限,读写速度快
- 指令
- 数据
- 地址
常见汇编指令
- 寄存器类
- 通用寄存器 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
- ...
- 通用寄存器 EAX、EBX、ECX、EDX:是 ax,bx,cx,dx 的延伸,各为 32 位
- 命令类
- 通用
- 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