汇编复习

通用寄存器

以16位为例。

AHAL
BHBL
CHCL
DHDL
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是递增

JCC

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值