《汇编语言》总结
一、常见的寄存器
1. 通用寄存器
包括:
AX
累加寄存器
BX
基址寄存器(常用于存放要使用数据的偏移地址,即放在[]中的数据)
CX
计数寄存器(使用Loop
指令循环时其会存放要循环的次数)
DX
数据寄存器
注:数据在寄存器中以小端序方式进行填充,低8位构成AL
寄存器,高八位构成AH
寄存器
2. 段寄存器
CS
代码段寄存器
DS
数据段寄存器
SS
堆栈段寄存器
ES
附加段寄存器
3. 指针寄存器
SP
堆栈指针寄存器(指向堆栈的当前栈顶)
BP
基址指针寄存器(用于基址寻址)
SI
源变址寄存器
DI
目的变址寄存器
IP
指令指针寄存器(指向下一条即将执行指令的地址)
4. 标志寄存器
FLAG
寄存器由若干标志位组成,反映指令执行后的状态或控制CPU的行为,其包含的常用标志位有:
ZF
零标志位记录相关指令执行后结果是否为0,如果结果为0,则其为1,反之为0(标志寄存器的第6位)
PF
奇偶标志位记录相关指令执行后结果中所有bit位中1的个数是否为偶数,如果是偶数,则其为1,反之为0(标志寄存器的第2位)
SF
符号标志位记录相关指令执行后结果是否为负,若为负,则其为1,反之为0(标志寄存器的7位)
CF
进位标志位在进行无符号数计算的时候,其记录了运算结果的最高有效位的进位值,或从最高位的借位值,若进位或借位,则其为1,反之为0(标志寄存器的第0位)
注:进位与借位是指对于位数为N的无符号数而言其对应二进制信息的最高位,即N-1位(从0开始算),假想存在的第N位即为其最高有效位。相加超过表示范围会出现进位,相减出现负数会发生借位
OF
溢出标志位在进行有符号数计算的时候,其记录了结果是否发生了溢出,如发生溢出,则其为1,反之为0
注:CF是对无符号数有意义的标志位,OF是对有符号数有意义的标志位
DF
方向标志位在串处理指令(MOVSB、MOVSW,详见后文汇编指令部分)中控制SI、DI的增减,若为0,则递增,若为1,则递减
二、常用的寄存器组合
CPU要读写一个内存单元时,必须给出这个内存单元的地址。冒号前是段基地址,冒号后是偏移地址
CS:SP
对指向的内存单元读取指令并执行SS:SP
在任意时刻指向栈顶元素
注:栈的地址从高地址向低地址方向增长,入栈时SP减小
段寄存器:[]
[ ]表示一个内存单元,其中的数据表示内存单元的偏移地址
[ ]表示地址时默认段地址在DS中,若使用CS:[ ],ES:[ ],SS:[ ],ES[ ]等段前缀时则是显式地指明内存单元的段地址
[ ]中的内容也可表示为[BX]、[BX+idata]、[BX+DI]、[BX+DI+idata]的形式
SI
DI
BP
功能与BX
相近(但不可像BX一样拆成来年两个8位寄存器使用),只有这四个寄存器可在[]中进行内存单元的寻址,且组合使用时只能以四种组合出现:BX+SI
BX+DI
BP+SI
BP+DI
三、常用的汇编语言指令
汇编语言指令分为有对应机器码,最终被执行的汇编指令以及不会被执行的伪指令
常用的汇编指令有:
MOV
数据传送指令
格式:MOV 源操作数, 目的操作数
功能:将一个源操作数送到目的操作数中。ADD
加法指令
格式:ADD 源操作数, 目的操作数
功能:将源操作数的值加到目的操作数中,结果存放在目的操作数中。SUB
减法指令
格式:SUB 源操作数, 目的操作数
功能:从目的操作数中减去源操作数的值,结果存放在目的操作数中。JMP
无条件跳转指令
格式:JMP 目标地址
功能:将程序的控制权转移到目标地址处,执行指定代码。PUSH
压栈指令
格式:PUSH 操作数
功能:将操作数压入堆栈中,堆栈指针SP
递减。POP
弹栈指令
格式:POP 操作数
功能:从堆栈顶部弹出一个值存入操作数,堆栈指针SP
递增。LOOP
循环指令
格式:LOOP 目标地址
功能:循环操作,CX
寄存器值减1,若不为0则跳转到目标地址继续执行。AND
按位与指令
格式:AND 源操作数, 目的操作数
功能:按位与操作,结果存放在目的操作数中。OR
按位或指令
格式:OR 源操作数, 目的操作数
功能:按位或操作,结果存放在目的操作数中。MUL
无符号乘法指令
格式:MUL 操作数
功能:对寄存器AL
或AX
的值和操作数进行无符号乘法运算,结果存储在AX
或DX:AX
中。IMUL
有符号乘法指令
格式:IMUL 操作数
功能:对寄存器AL
或AX
的值和操作数进行有符号乘法运算,结果存储在AX
或DX:AX
中。DIV
无符号除法指令
格式:DIV 操作数
功能:将寄存器AX
或DX:AX
的值除以操作数,结果分别存放在商AL
或AX
和余数AH
或DX
中。IDIV
有符号除法指令
格式:IDIV 操作数
功能:对寄存器AX
或DX:AX
的值执行有符号除法,结果存放在AX
或DX
中。RET
子程序返回指令
格式:RET
功能:从子程序返回,弹出堆栈顶部地址并转移控制权到该地址。RETF
远返回指令
格式:RETF
功能:从远子程序返回,弹出堆栈中的段地址和偏移地址并转移控制权。CALL
子程序调用指令
格式:CALL 目标地址
功能:调用子程序,保存返回地址并跳转到目标地址处执行代码。ADC
带进位加法指令
格式:ADC 源操作数, 目的操作数
功能:将源操作数和进位标志位CF
加到目的操作数中,结果存放在目的操作数中。CMP
比较指令
格式:CMP 源操作数, 目的操作数
功能:将目的操作数减去源操作数,不存储结果,仅设置标志位。SBB
带借位减法指令
格式:SBB 源操作数, 目的操作数
功能:从目的操作数中减去源操作数和进位标志位CF
的值,结果存放在目的操作数中。MOVSB
字节字符串移动指令
格式:MOVSB
功能:将源地址(DS:SI
)处的一个字节移动到目的地址(ES:DI
)处,同时SI
和DI
分别增加或减少 1,具体取决于方向标志位DF
的设置。MOVSW
字字符串移动指令
格式:MOVSW
功能:将源地址(DS:SI
)处的一个字(2 个字节)移动到目的地址(ES:DI
)处,同时SI
和DI
分别增加或减少 2,具体取决于方向标志位DF
的设置。CLD
清方向标志指令
格式:CLD
功能:将方向标志位DF
清零(DF=0
)。STD
置方向标志指令
格式:STD
功能:将方向标志位DF
置位(DF=1
)。PUSHF
标志寄存器压栈指令
格式:PUSHF
功能:将标志寄存器的内容压入堆栈中。POPF
标志寄存器弹栈指令
格式:POPF
功能:从堆栈弹出一个值存入标志寄存器中。LEA
(加载有效地址)指令
格式:LEA 寄存器, 内存地址
功能:将内存地址的有效地址(偏移地址)加载到指定的寄存器中,而不对内存进行实际访问。
常用的伪指令有:
DB
定义字节
格式:标识符 DB 数据
功能:定义一个或多个字节数据,并为其分配存储空间。DW
定义字
格式:标识符 DW 数据
功能:定义一个或多个字(2 字节)数据,并为其分配存储空间。DD
定义双字
格式:标识符 DD 数据
功能:定义一个或多个双字(4 字节)数据,并为其分配存储空间。DUP
重复定义
格式:数据 DUP(值)
功能:用于重复定义多个相同的值。END
程序结束
格式:END [地址]
功能:标记程序的结束,并可选择指定程序的入口地址。SEGMENT
和ENDS
定义段
格式
1 | 段名 SEGMENT |
功能:定义代码段、数据段或栈段