16位汇编学习笔记
一、常见的寄存器
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 目标地址
功能 :将程序的控制权转移到目标地址处,执行指定代码。
注:跳转指令分近跳转和远跳转,近跳转的范围仍在同一代码段内,即仅修改IP寄存器;而远跳转会同时修改CS和IP,跳转范围会跨代码段或跨特权级1
2
3
4
5;近跳转示例
jmp 0x1234
;远跳转示例
jmp 0x08:0x12345678PUSH压栈指令
格式 :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
2
3段名 SEGMENT
... ; 段内代码或数据
段名 ENDS功能 :定义代码段、数据段或栈段
