一:通用寄存器
1.数据寄存器
AX ,BX,CX, DX,这四个寄存器在操作中可以存放各种类型的数据,但是他们存放的数据都有一定的规范 ,当我们使用loop指令时,他的循环次数受到CX里面数据的影响,CX里面存了什么数,就循环多少次,每循环一次又会将CX里面的值减一,当我们使用MUL和DIV指令时,他们都是单操作数,这个时候就有很多人疑惑了,乘除不应该是双操作数吗,但是系统的处理是在这两个指令后面一般放BX,BX里面的是除数,而被除数在AX里面,最后的商放在AX里面,余数放在BX里面,还有当我们使用一些系统调用时,也会有类似的情况。并且这四个16位的寄存器每一个都可以被拆分为两个8位的寄存器,比如AX被拆分为ah和al,第一个存储的是高八位,第二个存储的是低八位。这样的寄存器也是经常被使用。
2.地址指针寄存器
SP 栈指针寄存器,用于指向当前堆栈的栈顶。
SP的用法
; 假设我们要调用一个函数,并且需要保存当前的 BP 值
; 首先,将当前的 BP 值压入栈中
PUSH BP
; 然后,将 SP 的值移动到 BP,这样 BP 就指向了旧的栈顶
MOV BP, SP
; 现在,BP 可以用来作为新的栈帧的基地址
; 接下来,我们可以在栈上分配局部变量的空间
SUB SP, 10h ; 分配16字节的空间
; 函数结束后,恢复 BP 的值,并从栈中弹出旧的 BP 值
MOV BP, [BP - 2] ; 假设我们之前保存的 BP 值在 BP - 2 的位置
POP BP ; 从栈中弹出旧的 BP 值
BP 基址指针寄存器,用于存储堆栈的基地址。
BP的用法
; 假设我们有一个函数,需要使用 BP 来访问局部变量
MY_FUNCTION PROC
PUSH BP ; 保存旧的 BP 值
MOV BP, SP ; 设置新的栈帧基地址
; 分配局部变量空间
SUB SP, 10h ; 分配16字节的空间
; 访问局部变量
MOV AX, [BP - 4] ; 访问第一个局部变量
MOV [BP - 6], AX ; 将 AX 的值存储到第二个局部变量
; 恢复现场并返回
MOV SP, BP
POP BP
RET
MY_FUNCTION ENDP
3.变址寄存器
SI:源索引寄存器,主要用于字符串操作。
si的使用
MOV CX, 10 ; 设置要处理的字符串长度
LEA SI, Source ; 将源字符串的地址加载到 SI
LEA DI, Destination ; 将目的字符串的地址加载到 DI
; 字符串复制循环
CopyLoop:
MOV AL, [SI] ; 将源字符串当前位置的字符加载到 AL
MOV [DI], AL ; 将 AL 中的字符存储到目的字符串当前位置
INC SI ; 源字符串索引加 1
INC DI ; 目的字符串索引加 1
DEC CX ; 计数器减 1
JNZ CopyLoop ; 如果 CX 不为 0,继续循环
DI:目标索引寄存器,主要用于字符串操作
di的使用
MOV CX, 10 ; 设置要处理的字符串长度
LEA SI, Source ; 将源字符串的地址加载到 SI
LEA DI, Destination ; 将目的字符串的地址加载到 DI
; 字符串复制循环
CopyLoop:
MOV AL, [SI] ; 将源字符串当前位置的字符加载到 AL
MOV [DI], AL ; 将 AL 中的字符存储到目的字符串当前位置
INC SI ; 源字符串索引加 1
INC DI ; 目的字符串索引加 1
DEC CX ; 计数器减 1
JNZ CopyLoop ; 如果 CX 不为 0,继续循环
二:段寄存器
-
CS:代码段寄存器,用于存储代码段的基地址。
-
DS:数据段寄存器,用于存储数据段的基地址。
-
SS:堆栈段寄存器,用于存储堆栈段的基地址。
-
ES:附加段寄存器,可用于存储其他数据段的基地址。
三:专用寄存器
-
IP:指令指针寄存器,用于存储下一条要执行的指令地址。
-
FLAGS:标志寄存器,用于存储某些条件码和状态信息,如进位标志、零标志、符号标志等。