目录
[1. push ebp](#1. push ebp)
[2. mov edx, DWORD PTR [esp + 8]](#2. mov edx, DWORD PTR [esp + 8])
[3. mov al, 255](#3. mov al, 255)
[4. mov WORD PTR [ebp + 20], cx](#4. mov WORD PTR [ebp + 20], cx)
[5. lea eax, [ecx + edx * 2 + 4]](#5. lea eax, [ecx + edx * 2 + 4])
[练习2: 更精简版本](#练习2: 更精简版本)
核心转换规则
| 特性 | Intel 格式 | AT&T 格式 |
|---|---|---|
| 操作数顺序 | 目标, 源 (dst, src) |
源, 目标 (src, dst) |
| 寄存器命名 | 直接写寄存器名(如 ebp) |
寄存器名前加 % 前缀(如 %ebp) |
| 立即数 | 直接写数值(如 255) |
立即数前加 $ 前缀(如 $255) |
| 操作数大小 | 用 BYTE/WORD/DWORD PTR 显式指定 |
用指令后缀 b(8 位)/w(16 位)/l(32 位) 指定 |
| 内存寻址 | [基址 + 索引*比例 + 偏移] |
偏移(基址, 索引, 比例) |
常见寄存器名对应的AT&T指令后缀

练习1:逐条指令转换与含义说明

1. push ebp
- AT&T 格式 :
pushl %ebp - 指令含义 :将 32 位基址指针寄存器
ebp的值压入栈中,常用于函数栈帧初始化,保存旧栈帧基地址。
2. mov edx, DWORD PTR [esp + 8]
- AT&T 格式 :
movl 8(%esp), %edx - 指令含义 :从栈指针
esp偏移 8 字节的内存地址处,读取一个 32 位双字(DWORD)数据,存入寄存器edx,通常用于获取函数参数。
3. mov al, 255
- AT&T 格式 :
movb $255, %al - 指令含义 :将立即数
255(8 位)存入 8 位累加器寄存器al,后缀b明确操作数为字节(8 位)。
4. mov WORD PTR [ebp + 20], cx
- AT&T 格式 :
movw %cx, 20(%ebp) - 指令含义 :将 16 位寄存器
cx的值,写入到基址指针ebp偏移 20 字节的内存地址处,后缀w明确操作数为字(16 位)。
5. lea eax, [ecx + edx * 2 + 4]
- AT&T 格式 :
leal 4(%ecx, %edx, 2), %eax - 指令含义 :计算有效地址
ecx + edx×2 + 4,并将该地址值存入 32 位寄存器eax(lea指令本质是地址计算,不访问内存)。
练习2: 更精简版本
