汇编学习

1,基本知识

AH&AL=AX(accumulator):累加寄存器
BH&BL=BX(base):基址寄存器
CH&CL=CX(count):计数寄存器
DH&DL=DX(data):数据寄存器
SP(Stack Pointer):堆栈指针寄存器
BP(Base Pointer):基址指针寄存器
SI(Source Index):源变址寄存器
DI(Destination Index):目的变址寄存器
IP(Instruction Pointer):指令指针寄存器
CS(Code Segment)代码段寄存器
DS(Data Segment):数据段寄存器
SS(Stack Segment):堆栈段寄存器
ES(Extra Segment):附加段寄存器
OF overflow flag 溢出标志 操作数超出机器能表示的范围表示溢出,溢出时为1.
SF sign Flag 符号标志 记录运算结果的符号,结果负时为1.
ZF zero flag 零标志 运算结果等于0时为1,否则为0.
CF carry flag 进位标志 最高有效位产生进位时为1,否则为0.
AF auxiliary carry flag 辅助进位标志 运算时,第3位向第4位产生进位时为1,否则为0.
PF parity flag 奇偶标志 运算结果操作数位为1的个数为偶数个时为1,否则为0.
DF direcion flag 方向标志 用于串处理.DF=1时,每次操作后使SI和DI减小.DF=0时则增大.
IF interrupt flag 中断标志 IF=1时,允许CPU响应可屏蔽中断,否则关闭中断.
TF trap flag 陷阱标志 用于调试单步操作.

常用寄存器

eax:通常用来做函数的返回值
ecx
edx
ebx
esp:栈顶的地址
ebp
esi、edi:用在内存数据移动时
eip:将要执行下一条命令的地址

堆栈平衡

1,如果要返回父程序,在进行堆栈操作时,一定保证在ret这条命令之前,esp指向的是我们压入栈中的地址。
类似下图,本来call指令压入了该指令的下个地址(00a01353)在这里插入图片描述
2,如果通过堆栈传递参数,在函数执行完毕后,要平衡参数导致的堆栈变化。
类似于下图,1,2是作为函数的参数,在函数执行完之后,1,2的地址还留在堆栈中,导致无用的地址还在使用,简而言之就是内存泄漏。
外平栈:在call命令下面,给esp赋值,使他指向原来的地址,本例可以用add esp,8
内平栈:使用ret 8,与外平栈类似,只不过这个是在函数内部。
在这里插入图片描述

2,常用命令

1,mov命令(移动数据)
寄存器到寄存器,寄存器到内存,内存到寄存器
2,movs
内存到内存,如果df为0(efl第10位),地址根据宽度自动增加,如果为1,则为递减
例如:movs byte ptr es:[edi],byte ptr es:[esi] 之后edi与esi变化
movsb , movsw ,movsd
3,stos
将al/ax/aex的值移动到edi指定的内存单元中(edi指定的地址同样会变)
例如:stos byte ptr es:[edi]
4,rep
按计数寄存器(ecx)指定的次数重复执行字符串指令
5,push
向堆栈中压入数据,修改栈顶指针esp寄存器(堆栈地址从大到小,所以esp寄存器减少)
6,pop
与push相反
7,jmp
eip寄存器存了下次要执行命令的地址,jmp命令就是修改eip寄存器的内容
8,call(f7调试)
jmp+把当前指令的下个指令的地址存入堆栈中,一般用在函数调用中
9,ret(一般与call配套)
将栈顶指针的值赋给eip,并且将栈顶指针加4(esp加4)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值