为开逆向的坑,开始学习汇编。
前段时间过了16位汇编语言,希望现在学习32位汇编轻松些
变量定义
变量定位
从偏移量100h作为当前偏移地址
ORG 100h
实现对齐地址
ALIGN 2 .(4,6,8,…)
EVEN ; 相当于 ALIGN 2
变量属性
变量定义可以定义变量名,变量名有两个属性
- 地址:首个变量所在存储单元的逻辑地址,含有段基地址和偏移地址
- 类型:诸如字节、字、双字….其实就是长度。
汇编程序提供了一些操作符:
属性 操作符 作用 地址 [] 将表达式或寄存器作为偏移量 $ 返回当前偏移地址 OFFSET 变量名 返回变量名所在段的偏移地址 SEG 变量名 返回段基地址 类型 类型名 PTR 变量名 TYPE 变量名 返回一个字,表明变量名的类型 LENGTHOD 变量名 返回整个变量的数据项数 SIZEOF 变量名 返回整个变量占用的字节数
寻址方式
- ##寻址方式的种类
- 常量表达的具体数值——立即数寻址
- 寄存器表达的其中内容——寄存器寻址
- 存储器地址表达的保存的数据——存储器寻址
- ##立即数寻址的注意事项
- 注意伪指令,这些都是编译器处理的,只要汇编过程中能确定的都是立即数
- 注意立即数没有类型,可以通过另一个操作数或者ptr伪指令确定立即数的类型
存储器寻址方式
令人纠结的寻址表
访问存储器方式 段寄存器 偏移地址 读取指令 CS EIP 堆栈操作 SS ESP 一般的数据访问 DS(*) 有效地址EA EBP或ESP SS(×) 有效地址EA 串指令的源操作数 DS(*) ESI 串指令的目的操作数 ES EDI 偏移地址的构成
这里是指上表中EA的通用公式32位有效地址 = 基地寄存器 + 编制寄存器 * 比例 + 位移量
- 基址寄存器:任何8各32位通用寄存器
- 编制寄存器:除ESP职位的任何32位通用寄存器
- 比例:1、2、4、8
- 位移量:8或32位有符号值
直接寻址
- 即,在上述公式中只给除位移量
- 需要注意的是,形如 mov eax,count (count是变量名) 就是直接寻址 mov eax,[count的偏移量]
- 寄存器间接寻址
- 形如 mov eax,[ebx]
- 在将EA放于寄存器中,查找在存器中地址的内存单元
- 寄存器相对寻址
- 形如 mov eax,[ebox + 4]
- 可以写成 mov eax,ebx[4]
- 可以处理传输组、字符串,(甚至结构体。。。)
- 变址寻址
- 使用了变址寄存器(esi、edi)的寻址操作,即为变址寻址
- 形如 mov eax,[ebx+esi+4]
- 亦或 mov eax,4[ebx][esi]
- 带比例的变址寻址
- 形如 mov eax,[ebx+esi*2+4]
_
- 形如 mov eax,[ebx+esi*2+4]
寻址方式的组合
如下: