汇编复习
通用寄存器
以16位为例。
AH | AL |
---|---|
BH | BL |
CH | CL |
DH | DL |
SP | |
BP | |
DI | |
SI |
AX是累加器(Accumlator),一般做数据运算;
BX是基地址寄存器(Base),除了数据运算还可以存放偏移地址;
CX是计数器(Count),除了数据运算,在串操作中存放串的初值;
DX是数据寄存器(Data),在乘除运算中,放乘数或者 被除数的高位,或者乘积的高位,或者余商位;
SP指向栈顶地址(Stack),就是当前栈顶的偏移量,段基地址在段寄存器SS中;
BP基址指针(Base),在有些间接寻址中,BP用于存放段内偏移地址,对应段为SS;
SI(Source) 例如函数赋值;
Di(Destination)
段寄存器
寄存器 | 含义 |
---|---|
CS | 代码段 |
DS | 数据段 |
SS | 堆栈段 |
ES | 拓展段 |
IP | 指令指针 //CS+IP就是CPU下一条要执行指令的物理地址 |
堆栈
堆栈:操作系统在启动时,已经分配好的一块内存,供程序使用
使用PUSH \POP指令,在PUSH时,将内容压入堆栈,然后SP指向的栈顶地址会减少相应字节,指向新的空栈顶,POP相反
基础指令
串操作
例:比较100字节的字符串,STING1为源首地址,STRING2为目标首地址,不相等字符地址送给BX,
字符送给AL
LEA SI,STRING1 //去地址指令, 给源寄存器
LEA DI,STIRNG2 // Destination
MOV CX,100 //串长度100,计数100次
CLD //标志位DF=0,地址按增量修改
REPE CMPSB //rep if equal, compare string byte 如果相等则重复比较,比较长度为比特
JCXZ STOP //若CX=0,jmp到STOP
DEC SI //否则就是出现不相等情况,SI-1指向不相等单元
MOV BX,SI
MOV AL,[SI] //[]为取内容 就像*
STOP: HLT //就像goto
CALL与JMP
jmp 指令跳转到某个地址执行(通过修改IP)也就是goto;
CALL 比如CALL函数,JMP到函数的地址执行函数体,CALL时会将原本要执行的下一条指令地址压入堆栈,在执行完函数体以后通过RETN跳回原地址;
//在反汇编中可以通过替换CALL指令来使**者难以了解程序具体逻辑
堆栈传参与寄存器传参
寄存器传参:
堆栈传参:
PUSH 1 //此时堆栈 1
PUSH 2 // 2 1
CALL FUN // addr 2 1
FUN:PTR SS:[ESP +4] //获取2个参数
PTR SS:[ESP +6] //第一个参数
RETN 8 //堆栈平衡
-----------------
PUSH 1 //此时堆栈 1
PUSH 2 // 2 1
CALL FUN // addr 2 1
ADD ESP,8 //堆栈平衡
FUN:PTR SS:[ESP +4] //获取2个参数
PTR SS:[ESP +6] //第一个参数
RETN //堆栈平衡
--------------------
PUSH 1 //此时堆栈 1 ESP 14H 20H
PUSH 2 // 2 1 16H addr
CALL FUN // addr 2 1 18H 2
PUSH EBP // 栈底 addr 2 1 假设此时栈顶地址14H 栈底20H EBP 20H 1
FUN:MOVE EBP,ESP // EBP 14H
SUB ESP,10H //分配给CALL函数的内存
PTR SS:[EBP +4] //获取2个参数,由于EBP指向了原来栈顶,所以可以由EBP寻址
PTR SS:[EBP +6] //第一个参数
MOV ESP,EBP
POP EBP
RETN
注意CALL前CALL后的堆栈与寄存器应当基本保持不变,除非需要传递返回值之类
局部变量通常用中断填满,防止栈溢出。
单步步入与单步步过
步入会进入CALL的函数地址单步执行,标志位TF置1。
步过遇到CALL时,会在顺序下一个地址打上断点(本质是把地址的指令改为 中断INT 3),一直执行到断点。
//反调试可以在CALL进入函数以后更改ESP(当前栈顶指针,保存了返回以后下一步的地址)的值,使调试器找不到正确指令。
使用大量无意义CALL迷惑**者,在关键返回处修改ESP使程序无法自动返回。
32位的标志位
//状态标志
CF 无符号数 加法高位进位,或者减法高位借位的时候置1,否则0,STC置1,CLC置0, CMC取反。
PF 运算结果的低位,含1的个数为偶数则为1 否则0;
AF 第四位向高位进借位时,通常用于BCD码的计算
ZF 有效位全为0 则为1
SF 有符号数的最高位(符号位)
OF 是否溢出
//控制标志
DF 串操作中 1是递减,0是递增