一、常见的寄存器

1. 通用寄存器

包括:

AX累加寄存器

BX基址寄存器(常用于存放要使用数据的偏移地址,即放在[]中的数据)

CX计数寄存器(使用Loop指令循环时其会存放要循环的次数)

DX数据寄存器

注:数据在寄存器中以小端序方式进行填充,低8位构成AL寄存器,高八位构成AH寄存器

2. 段寄存器

CS代码段寄存器

DS数据段寄存器

SS堆栈段寄存器

ES附加段寄存器

3. 指针寄存器

SP堆栈指针寄存器(指向堆栈的当前栈顶)

BP基址指针寄存器(用于基址寻址)

SI源变址寄存器

DI目的变址寄存器

IP指令指针寄存器(指向下一条即将执行指令的地址)

4. 标志寄存器

FLAG寄存器由若干标志位组成,反映指令执行后的状态或控制CPU的行为,其包含的常用标志位有:

  1. ZF零标志位

    记录相关指令执行后结果是否为0,如果结果为0,则其为1,反之为0(标志寄存器的第6位)

  2. PF奇偶标志位

    记录相关指令执行后结果中所有bit位中1的个数是否为偶数,如果是偶数,则其为1,反之为0(标志寄存器的第2位)

  3. SF符号标志位

    记录相关指令执行后结果是否为负,若为负,则其为1,反之为0(标志寄存器的7位)

  4. CF进位标志位

    在进行无符号数计算的时候,其记录了运算结果的最高有效位的进位值,或从最高位的借位值,若进位或借位,则其为1,反之为0(标志寄存器的第0位)

注:进位与借位是指对于位数为N的无符号数而言其对应二进制信息的最高位,即N-1位(从0开始算),假想存在的第N位即为其最高有效位。相加超过表示范围会出现进位,相减出现负数会发生借位

  1. OF溢出标志位

    在进行有符号数计算的时候,其记录了结果是否发生了溢出,如发生溢出,则其为1,反之为0

注:CF是对无符号数有意义的标志位,OF是对有符号数有意义的标志位

  1. DF方向标志位

    在串处理指令(MOVSB、MOVSW,详见后文汇编指令部分)中控制SI、DI的增减,若为0,则递增,若为1,则递减

二、常用的寄存器组合

CPU要读写一个内存单元时,必须给出这个内存单元的地址。冒号前是段基地址,冒号后是偏移地址

  1. CS:SP对指向的内存单元读取指令并执行

  2. SS:SP在任意时刻指向栈顶元素

注:栈的地址从高地址向低地址方向增长,入栈时SP减小

  1. 段寄存器:[][ ]表示一个内存单元,其中的数据表示内存单元的偏移地址

[ ]表示地址时默认段地址在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

三、常用的汇编语言指令

汇编语言指令分为有对应机器码,最终被执行的汇编指令以及不会被执行的伪指令

常用的汇编指令有:

  1. MOV 数据传送指令
    格式MOV 源操作数, 目的操作数
    功能:将一个源操作数送到目的操作数中。

  2. ADD 加法指令
    格式ADD 源操作数, 目的操作数
    功能:将源操作数的值加到目的操作数中,结果存放在目的操作数中。

  3. SUB 减法指令
    格式SUB 源操作数, 目的操作数
    功能:从目的操作数中减去源操作数的值,结果存放在目的操作数中。

  4. JMP 无条件跳转指令
    格式JMP 目标地址
    功能:将程序的控制权转移到目标地址处,执行指定代码。

  5. PUSH 压栈指令
    格式PUSH 操作数
    功能:将操作数压入堆栈中,堆栈指针SP递减。

  6. POP 弹栈指令
    格式POP 操作数
    功能:从堆栈顶部弹出一个值存入操作数,堆栈指针SP递增。

  7. LOOP 循环指令
    格式LOOP 目标地址
    功能:循环操作,CX寄存器值减1,若不为0则跳转到目标地址继续执行。

  8. AND 按位与指令
    格式AND 源操作数, 目的操作数
    功能:按位与操作,结果存放在目的操作数中。

  9. OR 按位或指令
    格式OR 源操作数, 目的操作数
    功能:按位或操作,结果存放在目的操作数中。

  10. MUL 无符号乘法指令
    格式MUL 操作数
    功能:对寄存器ALAX的值和操作数进行无符号乘法运算,结果存储在AXDX:AX中。

  11. IMUL 有符号乘法指令
    格式IMUL 操作数
    功能:对寄存器ALAX的值和操作数进行有符号乘法运算,结果存储在AXDX:AX中。

  12. DIV 无符号除法指令
    格式DIV 操作数
    功能:将寄存器AXDX:AX的值除以操作数,结果分别存放在商ALAX和余数AHDX中。

  13. IDIV 有符号除法指令
    格式IDIV 操作数
    功能:对寄存器AXDX:AX的值执行有符号除法,结果存放在AXDX中。

  14. RET 子程序返回指令
    格式RET
    功能:从子程序返回,弹出堆栈顶部地址并转移控制权到该地址。

  15. RETF 远返回指令
    格式RETF
    功能:从远子程序返回,弹出堆栈中的段地址和偏移地址并转移控制权。

  16. CALL 子程序调用指令
    格式CALL 目标地址
    功能:调用子程序,保存返回地址并跳转到目标地址处执行代码。

  17. ADC 带进位加法指令
    格式ADC 源操作数, 目的操作数
    功能:将源操作数和进位标志位CF加到目的操作数中,结果存放在目的操作数中。

  18. CMP 比较指令
    格式CMP 源操作数, 目的操作数
    功能:将目的操作数减去源操作数,不存储结果,仅设置标志位。

  19. SBB 带借位减法指令
    格式SBB 源操作数, 目的操作数
    功能:从目的操作数中减去源操作数和进位标志位CF的值,结果存放在目的操作数中。

  20. MOVSB 字节字符串移动指令
    格式MOVSB
    功能:将源地址(DS:SI)处的一个字节移动到目的地址(ES:DI)处,同时SIDI分别增加或减少 1,具体取决于方向标志位 DF 的设置。

  21. MOVSW 字字符串移动指令
    格式MOVSW
    功能:将源地址(DS:SI)处的一个字(2 个字节)移动到目的地址(ES:DI)处,同时 SIDI 分别增加或减少 2,具体取决于方向标志位 DF 的设置。

  22. CLD 清方向标志指令
    格式CLD
    功能:将方向标志位 DF 清零(DF=0)。

  23. STD 置方向标志指令
    格式STD
    功能:将方向标志位 DF 置位(DF=1)。

  24. PUSHF 标志寄存器压栈指令
    格式PUSHF
    功能:将标志寄存器的内容压入堆栈中。

  25. POPF 标志寄存器弹栈指令
    格式POPF
    功能:从堆栈弹出一个值存入标志寄存器中。

  26. LEA(加载有效地址)指令
    格式LEA 寄存器, 内存地址
    功能:将内存地址的有效地址(偏移地址)加载到指定的寄存器中,而不对内存进行实际访问。

常用的伪指令有:

  1. DB 定义字节
    格式标识符 DB 数据
    功能:定义一个或多个字节数据,并为其分配存储空间。

  2. DW 定义字
    格式标识符 DW 数据
    功能:定义一个或多个字(2 字节)数据,并为其分配存储空间。

  3. DD 定义双字
    格式标识符 DD 数据
    功能:定义一个或多个双字(4 字节)数据,并为其分配存储空间。

  4. DUP 重复定义
    格式数据 DUP(值)
    功能:用于重复定义多个相同的值。

  5. END 程序结束
    格式END [地址]
    功能:标记程序的结束,并可选择指定程序的入口地址。

  6. SEGMENTENDS定义段
    格式

1
2
3
段名 SEGMENT
... ; 段内代码或数据
段名 ENDS

功能:定义代码段、数据段或栈段