> 文章列表 > x86汇编

x86汇编

x86汇编

寄存器

x86汇编

常规

AX累加,算术运算或函数返回值存储
基址寄存器(BX),指向数据的指针
计数寄存器CX,移位,循环,一些量
数据寄存器DX,运算超过16位,高16位放在DX
堆栈指针寄存器SP,用于指向栈顶
栈基址指针寄存器BP,指向堆栈底部
源变址寄存器SI,指向流操作的源的一个指针
目标索引寄存器DI,流操作指向目标的指针
x86汇编

段寄存器

CS指向代码段
DS数据段
FS GS结构体

标志位寄存器

DF 表示运算时的进位
PF 奇偶标志,含偶数个1为1
AF 进位
ZF 零标志寄存器,若结果为0则为1
SF 设置为最高位的有效位
OF 大数相加会溢出时为1

内存和寻址模式

立即数寻址方式

操作数直接放在指令中,紧跟在操作码后,作为指令的一部分,存放在代码段
mov al,5
mov eax,32986

寄存器寻址

操作数在寄存器中
mov ax,bx

直接寻址方式

操作数在储存器中,指令给出存储器的偏移地址
mov ax,[2000h].一般访问全局变量用到

间接寻址

操作数的地址在基址寄存器或者变址寄存器中,而操作数在存储器中
mov ax,[bx]

基变址寻址

mov ax,[bx+si]
mov bx,[bp+si]
数组寻址会用到

寄存器相对寻址

mov ax,[di+100h]位移量是一个数字

常见指令

数据传送指令

mov:省略
push:操作数压入栈中,用于函数调用过程,ESP是栈顶,压栈前,先把ESP减4,再压入
push eax
pop:与push相反,先esp+4
lea:算地址的指令,把中括号的地址算出来,放到寄存器中
lea edi,[ebx+4*esi]

控制指令

jz
ja
jae
jb
jbe
je

调用约定

stdcall

参数从右向左压入堆栈
函数自身修改堆栈

push 2;第二个参数入栈
push 1;第一个参数入栈
call function;调用函数,把cs:eip入栈
push ebp;压入一个保存栈顶寄存器,指向栈顶,函数退出恢复
mov ebp,esp;把指向栈顶的寄存器esp存入ebp
mov eax,[ebp+8H];堆栈中依次存有ebp,cs:eip,12.ebp+8H指向1
add eax,[ebp+0CH];ebp+0CH处保存了2,把1+2赋值给eax
mov esp,ebp;恢复esp
pop ebp;
ret 8;入了两个参数各占4个字节,ret进行堆栈平衡

cdel

首先右向左入栈
函数本身不清理堆栈,调用者负责清理

push 2;第二个参数入栈
push 1;第一个参数入栈
call function;调用函数
add esp,8;首先把栈顶移8字节
push ebp;压入一个保存栈顶寄存器,指向栈顶,函数退出恢复
mov ebp,esp;把指向栈顶的寄存器esp存入ebp
mov eax,[ebp+8H];堆栈中依次存有ebp,cs:eip,12.ebp+8H指向1
add eax,[ebp+0CH];ebp+0CH处保存了2,把1+2赋值给eax
mov esp,ebp;恢复esp
pop ebp;
ret;

fastcall

函数第一个和第二个DWORD参数通过ECX EDX传递
其他参数右向左入栈
被调用函数清理堆栈

mov edx,DWORD PTR [ebx-0xcC];
mov eax,DWORD PTR [ebp-0x10];
push DWORD PTR [ebp-0x4];
push DWORD PTR [ebp-0x8];
mov ecx,eax;
call 50e  <<a2>a2>;

x86汇编