相关教程文件链接: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时,重复执行指令