- 背景举例
操作举例:把ebx的内容移动到eax中
机器指令:由0和1组成的序列
汇编指令:mov eax ,ebx (寄存器)
一、进制
16进制
89D8
1000 1001 1101 1000
二、寄存器介绍
(1)数据寄存器
- 寄存器介绍
CPU上的一个元件,CPU的组成部分之一,读写速度非常快
1)数据寄存器介绍
保存操作数,保存需要传递的数据
(0和1),保存计算结果
2)数据寄存器分类
1)EAX:累加寄存器,也称之为累加器。举例1+1=2,会把2放到eax里面
2)EBX:基地址寄存器,存放地址的寄存器
3)ECX:计数器寄存器,比如说写一个for循环,循环5次,5这个放在计数寄存器
4)EDX:数据寄存器,一般放需要的数据,for循环有个值是5,一般放在EDX
EAX,EBX,ECX,EDX为32位寄存器
AX,BX,CX,DX位16位寄存器
低八位:al
高八位:ah
- 使用指令结果展示
1)mov eax , 0x100
2)mov ax ,0x10 (16位寄存器)
3)mov ah,0x1 (高8位)
(2)指针寄存器
1)指针寄存器分类
操作栈的寄存器
ESP:保存指向栈顶的指针
EBP:保存指向栈底的指针
- 补充:栈的定义
保存栈的参数和变量
2)操作指针寄存器实例
1)push eax前
eax的值: 0019FFCC
堆栈信息:(0019FF70存的是0019FF80,栈底的地址)
2)push eax后
栈数据的变化:(由于是32位的exe,0019FF70栈顶向栈底偏移4个字节的长度,就是0019FF6C)
0019FF6C变为栈顶指针,栈顶指针存的数据变成原先eax的值0019FFCC
(3)变址寄存器
1)变址寄存器介绍
指寄存器ESI,EDI,SI,DI的寄存器,主要用于存放存储单元在段内的偏移量
2)作用介绍(了解一下,没啥特点)
ESI:存放地址的寄存器
EDI:存放地址的寄存器
(4)指令指针寄存器
EIP寄存器:由存断点的位置表示出来(保存CPU下一次将要执行代码的地址)
当执行到004013A5 68 D41E4000 push TraceMe.004040D0,push指令会把下一步执行代码的地址压栈,原先栈顶指针0019FF6C就变成0019FF68,且值变为004040D0,这就是EIP寄存器的作用
(5)标志寄存器
1)标志寄存器介绍和作用
EFL标志寄存器:也叫flag寄存器,占16位的大小
2)举例标志寄存器中:ZF寄存器的作用
(做运算就会影响ZF位)
3)举例截图说明
EFL:246的16进制
1001000110
sub esp,0x58 (由于esp减0x58不为0,ZF位置为0;当结果为0,ZF就置为1)
(6)段寄存器
1)段寄存器作用
因为对内存的分段管理而设置的。计算机需要对内存分段,用来给不同的程序使用
- 截图(红色方框部分)
2)段寄存器分类(不止6个,只是OD显示了6个)
ES:
CS:
SS:
DS:
FS:
GS:
3)段寄存器使用举例
mov dword ptr ds:[0x405528] , edx
解释:
把edx的值移动到ds.base+0x405528这个地址里面
4)段寄存器简单拆分
①可见部分
仅仅显示了16位
,例如上图中的002B的2B
②不可见部分的Base
:段开始的地方,举例比如说程序使用的内存是分段的,从1到10是一整段,像base就是1,+0x405528就是10,1到10就是一个程序用的一整段;上述举例的意思就是:edx的值放在一段地址里面
③Limit: 比如从1到10,11到20,那么10就是limit
④Attribute:属性,定义了这个段是否可读可写可执行
三、指令介绍
(1)数据传送指令(mov指令)
- 使用举例
move ebp,esp //把栈顶的数据移动到栈底
1)移动前
ESP:0019FF74
EBP:0019FF80
2)移动后
- 注意点:
1)位数大小一样的才能相互移动
2)不能用寄存器给立即数赋值
mov 123,esp
(2)加减运算指令
- 指令分类
add:加法
sub:减法 - 使用举例:
mov eax,0x0
add eax, 0x8 //eax变成0x0000008了
(3)逻辑运算
- 逻辑运算分类
逻辑与:and,同为1才为1
逻辑或:or,只要一个为1,就是1
逻辑异或: xor,同为0,异为1
逻辑非:not,0变成1,1变成0 - 使用举例
mov eax , 1
and eax , 2 //现在eax就是0
(4)移位指令
1)算术移位指令
- 分类
1)算术左移指令SAL:左移n次,等用于乘上2的n次幂,(高位放到标志寄存器的CF位),低位补0
2)算术右移指令SAR:右移n次,等于/2的n次幂(低位放入标志寄存器的CF位),高位补0
- 使用举例
mov eax,2
sal eax,1
00000010 -> 00000100
2)逻辑移位指令
逻辑左移SHL:同SAL,高位入CF,最低位补0,最高位入CF
逻辑右移SHR:右移1次,最高位补0,最低位入CF
(5)test、cmp指令
1)test指令
- 作用
做逻辑与运算(and),和与逻辑(and)不同的是,test指令不会影响寄存器的值,但是会影响标志位ZF的值(缩写Z) - 举例
and eax , 0x01 //若eax的值0号位是0,那么eax就变成0
//and不会改变标志寄存器的值
test eax,1 //eax的值没有改变,Z值变化:若eax做与运算,结果为0,则Z标志位为1
2)cmp指令
- 作用
实际上做减法运算(sub),不改变原来的值,只是改变ZF标志位(等于0置为1) - 代码举例
sub eax,0x01 //不为0