汇编语言笔记(数据传输、寻址和算术运行)
数据传送、寻址和算术运算
32位通用寄存器 | |
EAX | EBP |
EBX | ESP |
ECX | ESI |
EDX | EDI |
6个段寄存器 | |
CS代码段 | ES |
SS堆栈段 | FS |
DS数据段 | GS |
一个指令指针寄存器EIP
一个状态标志寄存器EFLAGS
指令的格式:标号 指令助记符 操作数 注释
数据定义语句的格式:【变量名】 数据定义伪指令 初始值 【,初始值 ……】
MOV指令从原操作数向目的操作数赋值数据
MOVZX将源操作数的内容复制到目的操作数中,并将该值零扩展至16或32位。
MOVSX将原操作数的内容复制到目的操作数中,并将该值符号扩展至16或32位。
LAHF将EFLAGE寄存器的低字节复制到AH寄存器中。
SAHF复制AH寄存器的值至EFLAGS寄存器的低字节中。
XCHG交换两个操作数的内容。
INC从操作数中加1
DEC从操作数中减1
ADD指令将同尺寸的源操作数和目的操作数相加
SUB将源操作数从目标操作数中减掉
NEG取反
和数据相关的操作符和伪指令
OFFSET操作数返回一个变量相对于其所在段开始的偏移
PTR操作符允许重载变量的默认尺寸
TYPE操作数返回数组中每个元素的大小
LENGTHOF操作数返回数组内元素的数目
SIZEOF操作符返回数组初始化时占用的字节数
PROTO伪指令声明函数的原型
PUSH首先减小ESP的值,然后将源操作数压入堆栈
POP弹出堆栈,增加ESP
PUSHFD将EFLAGS的值压入堆栈
POPFD将堆栈顶部的值弹出并送到EFLAGS中
PUSHAD指令将EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI压入堆栈
POPAD指令以相反的顺序从堆栈中弹出这些通用寄存器的值
过程使用PROC和ENDP指令声明,例如
main PROC
……
main ENDP
CALL指令指示处理器在新的内存地址执行指令
RET指令返回到程序中过程被调用的地方继续执行
CALL指令把返回地址压入栈并把调用过程的地址复制到指令指针寄存器中
RET指令从堆栈中弹出返回地址并送到指令指针寄存器中
ESP是栈指针用于指向栈的栈顶
寄存器ESI、EDI、SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量