汇编总结

相关教程文件链接:http://www.kipirvine.com/asm/

OF:溢出标志位  (与0做或运算,清0)

UP:方向标志位

EI:终端标志位

SF:符号标志位

ZF:零标志位

AF:辅助进位标志位

PF:奇偶标志位

CY:进位标志位  (stc进位置1,clc进位清0)

寄存器:

CS:CODE Segment 代码段寄存器

SS:Stack Segment 栈段寄存器

DS:Data Segment 数据段寄存器

ES:Extra(Data) Segment 附加(数据)段寄存器

FS:Data Segment 数据段寄存器

GS:Data Segment 数据段寄存器

ES、FS、GS寄存器用来存放附加数据段的段基址 

程序调试中会经常用到FS寄存器,它会用于计算SEH(Structured Exception Handler,结构化异常处理机制)、TEB(Thread Environment Block,线程环境块)、PEB(Process Enviroment Block,进程环境块)等地址 

$符号代表当前指令所在段的偏移量,例如eg:指令“jmp $+3”中的“$”表示当前这条指令在代码段中的偏移量。

::表示声明全局变量

※ret指令:ret强制CPU返回到该过程(也就是高级语言里的函数或方法)被调用的位置

※call指令:指挥处理器从新的内存地址开始执行。过程使用RET指令将处理器转回到该过程被调用的程序点上。

(注:在使用call时,指令将返回地址压入堆栈中,返回地址也就是call后面的那条指令地址,把被调用的过程地址复制到指令寄存器中,当过程返回时,将返回地址弹回到指令寄存器中)

 文件句柄:是32位整数,Windows操作系统用它来标识当前打开的文件。当用户程序调用一个Windows服务来打开或创建文件时,操作系统就创建一个新的文件句柄,并使其对用户程序可用。每当程序调用OS服务方法来读写该文件时,就必须将这个文件句柄作为参数传递给服务方法

label指令:插入一个标号,并定义大小属性,但不占用内存空间

valname label type

enter指令:两个操作数,第一个是常数,定义为局部变量保存的堆栈空间字节数并且总是向上舍入为4的倍数,第二个定义了过程的词法嵌套

enter numbytes,nestinglevel

等价于

push ebp

mov ebp,esp

sub esp-numbytes

leave指令:结束一个过程的堆栈帧,反转了enter的指令,恢复了过程被调用时ESP和EBP的值。

leave

等价于

mov esp,ebp
pop ebp

local:声明一个或多个变量名,并定义其大小,必须跟在PROC伪指令后面

local varlist;varlist是变量定义列表,用逗号分隔表项,可选为跨越多行。每个变量采用label:type形式。(标号可以为任意有效标识符,类型可以使标准类型,也可以使用户定义类型)

 macro指令:宏定义,可以定义数据、代码等,并且当遇到调用两次宏定义来定义数据时,可能会出现变量被定义两次的错误,这时可以使用local添加到定义变量的那,就会产生不同的标号名。

struct指令:结构,跟C语言的结构体一样,用来定义数据结构,很多系统函数都是用了结构体

int 21h指令:https://www.cnblogs.com/ynwlgh/archive/2011/12/12/2285017.html 超详细

exitm指令:终止了后续的宏的展开(类似返回值)

lea与offset指令区别:https://blog.csdn.net/qq_38216239/article/details/78601433

lea与OFFSET个人理解:offset需要确定的地址(已经指定了的),不像lea可以确定寄存器加一个常量类的地址

 jcc指令(条件跳转指令):https://blog.csdn.net/fengshh2301/article/details/53327195

cld:方向标志位清零(正向)

std:方向标志位置1(反向)

rep:ecx>0时,重复执行指令

原文地址:https://www.cnblogs.com/pppyyyzzz/p/11979881.html