首先我们知道8088/8086 CPU的内部共有14个16位寄存器。
按其功能又可分为三大类:通用寄存器,段寄存器,控制寄存器。
1.通用寄存器
通用寄存器包括数据寄存器,地址指针寄存器和变址寄存器。
2.段寄存器
3.控制寄存器IP,FLAGS
接下来就是我们的核心FLAGS
FKAGS成为标志寄存器或程序状态字(PSW),它是16位寄存器,但只使用其中的9位。
这9位包括6个状态标志和3个控制标志。
不同指令对标志位具有不同的影响。
CF 进位标志位
Mov a1,98H
Add al,al ;执行后(al)=30H,CF =1.
PF奇偶标志位
偶数为1
SF符号标志位
负数为1
ZF
运算结果为0时ZF为1
OF
进行有符号的数运算时,如结果超过了机器所能表示的范围就是溢出。
AF
辅助进位标志位
DF
减地址为1
对于转移指令呢,我们先直接举一个例子:
统计正数负数和零的个数
START : XOR AL,AL
MOV PLUS,AL
MOV MINUS.AL
MOV ZERO,AL
LEA SI,TABLE
MOV CL,100
CLD
CHECK: LODSB
OR AL,AL
JS X1
JZ X2
INC PLUS
JMP NEXT
X1: INC MINUS
JMP NEXT
X2: INC ZERO
NEXT: DEC CL
JNZ CHECK
HLT
那么这个例子就成功用了JS JZ这两条指令
再看这个例子
LEA BX,DATA
MOV AL,[BX]
INC BX
CMP AL,[BX]
JNC DONE
MOV AL,[BX]
DONE: MOV MAX,AL
HLT
那么这个例子就成功用了JNC这条指令,对比就是JC啦
也就是无进位转移即CF=0,也就是大于
再比如下面这个例子找其中最大和最小的数
START : LEA SI,DATA
MOV CX,200
CLD
LODSW AX
MOV MAX,AX
MOV MIN,AX
DEC CX
NEXT: LOSDW
CMP AX,MAX
JG LARGER
CMP AX,MIN
JL SMALL
JMP GOON
LARGER: MOV MAX,AX
JMP GOON
SMALL: MOV MIN,AX
GOON: LOOP NEXT
HLT
例4.求从TABLE开始的10个无符号字节数的和,结果放SUM字单元中
DATA SEGMENT
TABLE DB 12H,23H,34H,45H,56H
DB 67H,78H,89H,9AH,0FDH
SUM DW ?
DATA ENDS
;
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:DATA
START: MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,TABLE
MOV CX,10
XOR AX,AX
NEXT: ADD AL,[SI]
ADC AH,0
INC SI
LOOP NEXT
MOV SUM,AX
MOV AH,41H
INT 21H
CODE ENDS
END START
例5.将数据区中以BUFFER为首地址的100个字节单元清零
DATA SEGMENT
BUFFER DB 100 DUP(?)
COUNT DW 100
DATA ENDS
;
STACK SEGMENT
DW 32 DUP(?)
STACK ENDS
;
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,ES:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV CX,COUNT
LEA BX,BUFFER
ADD CX,BX
AGAIN: MOV BYTE PTR[BX],0
INC BX
CMP BX,CX
JB AGAIN
MOV AH,4CH
INT 21H
CODE ENDS
END START
例7.
DATA SEGMENT
DATA1 DB 80 DUP(?)
DATA2 DB 5 DUP(0)
DATA ENDS
;
STACK SEGMENT
DW 32 DUP(?)
STACK ENDS
;
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AX,STACK
MOV SS,AX
MOV CX,80
LEA SI,DATA1
LEA DI,DATA2
AGAIN: MOV AL,[SI]
CMP AL,90
JC NEXT1
INC BYTE PTR[DI]
JMP STO
NEXT1: CMP AL,80
JC NEXT2
INC BYTE PTR[DI+1]
JMP STO
NEXT2: CMP AL,70
JC NEXT3
INC BYTE PTR[DI+2]
JMP STO
NEXT3: CMP AL,60
JC NEXT4
INC BYTE PTR[DI+3]
JMP STO
NEXT4: INC BYTE PTR[DI+4]
STO: INC SI
LOOP AGAIN
MOV AH,4CH
INT 21H
CODE ENDS
END START