汇编指令 总结
【连续第1天总结】
笔记来源于《汇编语言》王爽著,主要对平常用到的汇编中寄存器
和指令
进行总结
0x01 寄存器
寄存器进行信息存储;通俗的理解为——变量(CPU中的)
8086CPU有14个寄存器:
AX、BX、CX、DX、
SI、DI、
IP、SP、BP、
CS、DS、SS、ES、
PSW
通用寄存器:AX,BX,CX,DX;这4个寄存器通常用来存放一般性的数据,被称为通用寄存器
段寄存器:CS、DS、SS、ES;存放内存单元的段地址
代码段寄存器:CS 指令指针寄存器:IP
(CPU将CS:IP 指向的内容当作指令执行)
数据段寄存器:DS […]:表示一个内存单元地址
([address]表示一个偏移地址为address的内存单元)
(用mov指令访问内存单元,可以在mov指令中只给出单元的偏移地址,此时,段地址默认在DS寄存器中)
栈顶段地址:SS 偏移地址:SP
(任意时刻,SS:SP指向栈顶元素)
[bx]也表示一个内存单元,bx存放偏移地址
(ax):表示ax中的内容
标志寄存器:flag;其中存储的信息通常被称为程序状态字(PSW),它的每一位都有特殊的功能
ZF标志:
CPU访问内存单元时,必须向内存提供内存单元的物理地址。8086CPU在内部用段地址和偏移地址移位相加的方法形成最终的物理地址。
0x02 指令
mov ax,bx 将寄存器BX中的数据送入寄存器AX(AX=BX)
mov al,[O] 从1000:0单元的数据到al的传送;CPU会自动从数据段地址中ds中取出段地址,然后加上偏移地址,找到内存单元,然后读取数据
add ax,bx 将AX和BX中的数值相加,结果存在AX中(AX=AX+BX)
sub 寄存器,寄存器
jmp 段地址:偏移地址 同时修改CS、IP的内容
jmp 某一合法寄存器 仅修改IP的内容;用寄存器中的值修改IP
jmp ax
push ax 入栈;表示将寄存器ax中的数据送入栈中
pop ax 出栈;表示从栈顶取出数据送入ax
8086CPU的入栈和出栈都是以字为单位进行的
loop 有循环的含义
//转移指令CALL和RET它们都修改IP,或同时修改CS和IP。经常被共同用来实现子程序的设计
call指令
ret指令用栈中的数据,修改IP的内容,从而实现近转移
0x03 汇编代码分析
- 调用函数时,需要使用栈数据结构
(1)传递参数
函数调用时,需要传递参数,而在汇编中是将参数放到栈中来调用一个函数
调用栈
push 参数3
push 参数2
push 参数1
call xxxx //调用函数,并返回地址压入栈中
push ebp //将之前的EBP压入
mov ebp,esp //建立新的空栈
sub esp,xxxx //开辟新的栈空间,之后往栈中放入局部变量
...... //函数代码
mov esp,ebp //将esp回到ebp处,为了取之前的ebp
pop ebp //取之前的ebp
ret //结束