欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

常用汇编指令及堆栈图

程序员文章站 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中的堆栈想象成是一个公用的书箱,函数就像是使用箱子的人,函数在执行的时候,会用到这个书箱,把一些数据存到里面,但用完的时候一定要记得把书拿走,否则会乱的,也就是说,你放进去几本书,走的时候也要拿走几本书,这个就是堆栈平衡

相关标签: reverse 的入门