基本知识:8086/8088各寄存器的使用
1.数据寄存器:AX,BX,CX,DX,都可以拆分为_L与_H使用,即将16位的通用寄存器分为低八位和高八位使用(如AL、AH)
2.地址指针寄存器:
SP:堆栈指针寄存器,内容为栈顶偏移地址
BP:基址指针寄存器,常用于访问内存时存放内存单元偏移地址
3.变址寄存器:
SI、DI,常用于指令间的变址寻址或间接寻址
4.段寄存器:
CS:16位代码段,8086/8088复位后只有CS值不为0,为FFFFH
DS:16位数据段
ES:16位附加段
SS:16位堆栈段
5.控制寄存器
IP:指令指针寄存器,内容为下一条要执行指令的偏移地址
FLAGS:标志寄存器
分控制标志:CF(进位标志)、PF(奇偶标志)、AF(辅助进位标志(第四位的进位情况))、ZF(零标志)、SF(符号标志)、OF(溢出标志)
和状态标志:TF(跟踪标志)、IF(中断标志)、DF(方向标志)
存储器编址规则
指令地址:CSX10H+IP
堆栈操作地址:SSX10H+SP
操作数地址:DS(ES)X10H+偏移地址
常用指令意义与规则
1.数据传递指令MOV
格式:MOV reg,reg
使用规则:
①不允许将IP作为目的寄存器
②不允许mem<-mem,不允许seg<-seg
③立即数不允许作为目的数
④不允许立即数传给段寄存器
⑤源操作数与目的操作数类型要一致
2.常用运算指令
指令 | 格式 | 功能 |
---|---|---|
ADD | ADD AX,BX | 将BX中数值与AX中数值相加,结果放在AX中 |
ADC | ADC AX,BX | 带进位的加法(会加上CF的值),常用于高位加法 |
INC | INC AX | 加一指令,不影响标志位 |
SUB | SUB AX,BX | 将AX与BX相减结果送入AX中 |
SBB | SBB AX,BX | 带借位减法(会减去CF值),常用于高位减法 |
DEC | DEC AX | 减一指令 |
AAA | AAA | 非压缩BCD码调整指令(调整为标准二进制) |
3.比较指令与转移指令
指令 | 格式 | 功能 |
---|---|---|
CMP | CMP AX,BX | 结果为AX-BX的值,但不赋给AX,而是改变标志位ZF、OF、CF |
JMP | JMP A1 | 无条件跳转至A1处 |
JB/JC | JB A1 | 小于或CF=1则跳转至A1处 |
JNB/JAE/JNC | JNB A1 | 大于等于或CF=0则跳转至A1处 |
JP/JPE | JP A1 | 奇偶标志PF=1则转A1 |
JNP/JPO | JNP A1 | 奇偶标志PF=0则转A1 |
JZ/JE | JZ A1 | 为零或ZF=1则转A1 |
JNZ/JNE | JNZ A1 | 不为零或ZF=0则转A1 |
JS | JS A1 | SF=1则转A1 |
JNS | JNS A1 | SF=0则转A1 |
JO | JO A1 | OF=1则转A1 |
JNO | JNO A1 | OF=0则转A1 |
JA | JA A1 | CF=0且ZF=0,则高于时转A1(无符号数) |
JNA/JBE | JNA A1 | CF=1或ZF=1,则低于时转A1(无符号数) |
JG | JG A1 | SF⊕OF=0且ZF=0,则大于时转A1(有符号数) |
JGE | JGE A1 | SF⊕OF=0或ZF=1,则大于或等于时转A1 |
JL | JL A1 | SF⊕OF=1且ZF=0,则小于时转A1 |
JLE | JLE A1 | SF⊕OF=1或ZF=1,则小于等于时转A1 |
4.循环指令
指令 | 格式 | 功能 |
---|---|---|
LOOP | LOOP A1 | 使CX自减,若CX为0则跳转至标志位A1处继续执行 |
LOOPZ | LOOPZ A1 | 使CX自减,若CX不为零且ZF=1则跳转至A1处继续执行 |
LOOPNZ | LOOPNZ A1 | 使CX自减,若CX不为零且ZF=0则跳转至A1处继续执行 |
JCXZ | JCXZ A1 | 若CX为零,则跳转至A1处继续执行 |
5.逻辑指令
指令 | 格式 | 功能 |
---|---|---|
NEG | NEG AX | 求补指令,使该数变为绝对值相等,符号相反的另一数 |
AND | AND AX,FEH | 逻辑与,常用于指定位的保留与舍弃 |
OR | OR AX,BX | 逻辑或,常用于两操作数的组合 |
NOT | NOT AX | 逻辑非 |
XOR | XOR AX,AX | 逻辑异或,常用于寄存器清零 |
6.变量操作指令
定义一个变量:PDATA DW 20 DUP(?),其中”PDATA“为变量名,也称之为所定义的数据区首地址
数据定义伪指令:DB(定义字节,16位,两个存储空间),DW(定义字,216位,四个存储空间),DD(定义双字,2216位,八个存储空间),DT(定义10字节,1016位,20个存储空间)
数据存储规则:若数据为字节型,则按存储单元由小到大存,若数据为字型,则应该高位存高位,低位存低位。此外,若存入的数为负数,则应该存其补码。(例如将DW定义的-5D存入编址为0000H的空间处,则在0000H处存FB,在0001H处存FF,也即-5D在存储单元中存的是FFFBH)
表达式DUP的用法:DUP用于定义重复的数据单元,如DB N DUP(重复数据),表示定义了N个字节类型的重复数据
指令 | 格式 | 功能 |
---|---|---|
OFFSET | MOV SI,OFFSET PDATA | 将PDATA的偏移地址传入SI |
SEG | MOV AX,SEG PDATA | 将PDATA的段基址(段首地址除10H)存入AX |
TYPE | MOV BL,TYPE PDATA | 将PDATA的类型值送BL |
LENGTH | MOV BH,LENGTH PDATA | 求PDATA的项数 |
SIZE | MOV CL,SIZE,PDATA | 求所占存储单元数 |
EQU | COUNT EQU $-BUF | 等值指令,即COUNT=$-BUF |
ORG | ORG 2000H | 设置$的值为表达式的值 |
7.地址相关指令
指令 | 格式 | 功能 |
---|---|---|
LEA | LEA AX,[BX] | 传偏移地址 |
LDS | LDS AX,[BX] | 传地址指针,传给reg与DS |
LES | LES AX,[BX] | 传地址指针,传给reg与ES |
8.移位指令
注意只有移动一位时可以直接写,超过一位要先将移动位数写入寄存器,再用该寄存器作为移位的源操作数,移位对象作为目的操作数。
指令 | 格式 | 功能 |
---|---|---|
SAL/SHL | SAL AX,1 | 将AX中存的数算数/逻辑左移一位,最高位送CF,最低位补零 |
SAR | SAR AX,1 | 将AX中存的数算数右移一位,最高位补原最高位值,最低位送CF |
SHR | SHR AX,1 | 将AX中存的数逻辑右移一位,最高位补零,最低位送CF |
ROL | ROL AX,1 | 将AX中存的数循环左移一位,最高位送CF,最低位由原最高位传入 |
ROR | ROR AX,1 | 将AX中存的数循环右移一位,最低位送CF,最高位由原最低位传入 |
RCL | RCL AX,1 | 将AX中存的数带进位循环左移一位,最高位送CF,最低位由CF值传入 |
RCR | RCR AX,1 | 将AX中存的数带进位循环右移一位,最低位送CF,最高位由CF值传入 |
9.堆栈指令
指令 | 格式 | 功能 |
---|---|---|
PUSH | PUSH AX | 入栈指令,BL->SP,BH->SP-1,SP=SP-2 |
POP | POP AX | 出栈指令,BL<-SP,BH<-SP-1,SP=SP+2 |