汇编语言里面绕不开的状态标志寄存器和转移指令

首先我们知道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
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值