常用汇编指令及堆栈图
程序员文章站
2022-07-03 14:43:42
...
常用汇编指令及堆栈图
第一部分、汇编指令
一、常用汇编指令
1通用数据传送指令.
MOV 传送字或字节.
MOVSX 先符号扩展,再传送.
MOVZX 先零扩展,再传送.
PUSH 把字压入堆栈.
POP 把字弹出堆栈.
PUSHA 把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈.
POPA 把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈.
PUSHAD 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈.
POPAD 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈.
BSWAP 交换32位寄存器里字节的顺序
XCHG 交换字或字节.(至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG 比较并交换操作数.(第二个操作数必须为累加器AL/AX/EAX)
XADD 先交换再累加.(结果在第一个操作数里)
XLAT 字节查表转换.----BX指向一张256字节的表的起点,AL为表的索引值(0-255,即0-FFH);返回AL为查表结果.([BX+AL]->AL)
2. 输入输出端口传送指令.
IN I/O端口输入. ( 语法: IN 累加器, {端口号│DX} )
OUT I/O端口输出. ( 语法: OUT {端口号│DX},累加器 )输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时,其范围是 0-65535.
3. 目的地址传送指令.
LEA 装入有效地址.例: LEA DX,string ;把偏移地址存到DX.
LDS 传送目标指针,把指针内容装入DS.例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES 传送目标指针,把指针内容装入ES.例: LES DI,string ;把段地址:偏移地址存到ES:DI.
LFS 传送目标指针,把指针内容装入FS.例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
LGS 传送目标指针,把指针内容装入GS.例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS 传送目标指针,把指针内容装入SS.例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
4. 标志传送指令.
LAHF 标志寄存器传送,把标志装入AH.
SAHF 标志寄存器传送,把AH内容装入标志寄存器.
PUSHF 标志入栈.
POPF 标志出栈.
PUSHD 32位标志入栈.
POPD 32位标志出栈.
二、EFLAGS寄存器
CF:进位位。
如果运算结果的最高位产生一个进位或错位,则CF置1,否则CF清零。
PF:奇偶位。
如果运算结果低8位中“1”的个数为偶数时,则PF置1。否则PF清0。
AF:辅助进位位。
反应运算结果低四位产生进位或错位的情况。
ZF:零值位。
如果运算结果为零则ZF置1。否则清零。
SF:符号位。
如果运算结果为负,即一个数的最高位为1,则SF置1,否则SF清零。
OF:溢出位。
如果运算结果超过当前运算位数所能表示的范围,则称为溢出,OF的值被置为1,否则,OF的值被清为0。
三、JCC
第二部分 堆栈图
一、一个简单C语言程序的堆栈图
#include<stdio.h>
int function(int x ,int y,int z)
{
return x+y-z;
}
int main()
{
function(2,3,4); //仅仅调用此函数而已
}
堆栈图如下(过程)
不同的编译器生成的堆栈图可能不同,要视情况而定
二、汇编中的函数
1、汇编中的函数
2、函数的入口
3、函数的出口
三、Windows堆栈
1、Windows堆栈的特点:
1、先进后出
2、向低地址扩展
2、什么是堆栈平衡:
Windows中的堆栈,是一块普通的内存,主要用来存储一些临时的数据和参数等,可以把Windows中的堆栈想象成是一个公用的书箱,函数就像是使用箱子的人,函数在执行的时候,会用到这个书箱,把一些数据存到里面,但用完的时候一定要记得把书拿走,否则会乱的,也就是说,你放进去几本书,走的时候也要拿走几本书,这个就是堆栈平衡