FLAGS标志寄存器讲解

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

微机原理整理江苏大学
非计算机专业使用,本人私人资料;微机原理97
FLAGS标志寄存器:6个状态标志位和3个控制标志
CF:进位标志位。

当进行加减法运算时,若最高位向前有进借位CF=1,无CF=0。

PF:奇偶标志位。

当运算结果的低8位中1的个数为偶数时PF=1,为奇数时PF=0。

AF:辅助进位标志。

D3向D4有借进位发生时AF=1,无借进位发生AF=0。

ZF:零位标志。

当运算结果为零时ZF=1,运算结果不为零时ZF=0。

SF:符号标志位。

当运算结果的最高位为1时SF=1,最高位为0时SF=0。

OP:溢出标志位。

当运算结果超出了带符号数的范围,即溢出时OF=1,未溢出时OF=0。

(D7为符号位,说明:D7,D6,D5,D4,D3,D2,D1,D0)
3.3.2算数运算指令
算数运算指令;加,减,乘,除
有符号数的溢出:OF
无符号数的溢出:CF
指令对操作数的要求:单操作数指令中的操作数不允许使用立即数
双操作数指令中,立即数只能作为源操作数,不允许源操作数和目的操作数都是存储器。

1,加法运算指令(不允许段寄存器作为操作数和两个都是存储器)
1)ADD普通加法指令(对全部6个状态标志位都会产生影响)
ADD OPRD1,OPRD2 ;OPRD1+OPRD2送到OPRD1中去
ADD [SI],[BX]是错误的;不允许两个操作数都是存储器操作数例:MOV AL,7EH
ADD AL,5BH
程序执行后,AL=D9H,即11011001B, D9H>7FH(8位带符号数的最大值) OF=1
D9H<FFH(8位无符号数的最大值) CF=0 所有状态标志位AF=0,CF=0,OF=1,PF=0,SF=1,ZF=0
2)ADC带进位(CF)位的加法指令(对全部6个状态标志位都会产生影响)ADC OPRD1,OPRD2 ;OPRD1+OPRD2+CF送到OPRD1中去
不允许两个操作数都是存储器操作数
例:设CF=1,写出以下指令执行后的结果
MOV AL,7EH
ADC AL,0ABH
指令执行后:AL=7EH+0ABH+1=2AH,且CF=1
3)INC加1指令(不影响CF,影响其它5个状态标志)
INC OPRD ;OPRD+1送到OPRD中去
OPRD不能是立即数
通常用于在循环程序中修改地址指针及循环次数
2,减法指令(不允许段寄存器作为操作数和两个都是存储器)
1)SUB不考虑借位的减法指令(对全部6个状态标志位都会产生影响)SUB OPRD1,OPRD2
不允许两个操作数都是存储器操作数
例:SUB AL,[BP+SI] ;将SS:[BP+SI]单元的内容送到AL中去
基址变址寻址:基址:BX或BP 变址:SI或DI
DS☺[BX][变址]
SS ☺[BP][变址]
2)SBB考虑借位的减法指令(对全部6个状态标志位都会产生影响)
SUB OPRD1,OPRD2 ;将OPRD1-OPRD2-CF送到OPRD1中
不允许两个操作数都是存储器操作数
3)DEC减1指令(不影响CF,影响其它5个状态标志)
DEC OPRD
OPRD不能是立即数
4)NEG求补指令(对全部6个状态标志位都会产生影响)
NEG OPRD (求负数的绝对值);用0-OPRD CF通常为1,除非OPRD为0
OF通常为0,除非OPRD为80H(-128)或8000H(-32768),执行后操作数不变,但是OF为1。

5)CMP比较指令(仅影响6个状态标志位)
CMP OPRD1,OPRD2 ;OPRD1-OPRD2,结果不送回OPRD1
不允许两个操作数都是存储器操作数
比较两个操作数的大小关系。

相等:ZF=1
不相等:无符号数,CMP AX,BX CF=0,AX>BX
CF=1,AX<BX
有符号数,CMP AX,BX SF,OF相同,AX>BX
SF,OF不同,AX<BX
例:3-24在内存数据段从DA TA开始的单元中存放了两个8位无符号数,试比较他们的大小,并将大的数送MAX单元、
LEA BX,DATA
MOVE AL,[BX]
INC BX
CMP AL,[BX]
JNC DONE
MOV AL,[BX]
DONE:MOV MAX,AL
HLT
3,乘法指令
MUL无符号乘法指令(影响CF和OF)
MUL OPRD隐含寻址方式,隐含目标操作数AX(DX),源操作数由指令给出。

字节乘法:OPRD*AL 送到AX中
字乘法:OPRD*AX 送到DX:AX中
这里,源操作数OPRD可以是8位或16位的寄存器或存储器。

乘法指令要求两操作数字长相等,且不能为立即数。

MUL BX ;用AX*BX送到DX:AX中
MUL BYTE PTR[SI] ;AL*[SI]送到AX中
MUL DL ;用AL*DL送到AX中
例:设AL=0FEH,CL=11H,两数均为无符号数,求AL与CL的乘积。

MUL CL
指令执行后:AX=10DEH,因AH中的结果不为零,故CF=OF=1。

乘积的高半部分不为0,则CF=OF=1,代表AH或DX中包含乘积的有效数字
高半部分为0,则CF=OF=0
4,除法指令
DIV无符号数除法指令(对6个标志位均无影响)
DIV OPRD隐含寻址方式,隐含了被除数,除数OPRD不能为立即数
除数OPRD 8位,则被除数AX 16位字位拓展指令CBW
AX/OPRD放入AL,AX%OPRD放入AH
除数OPRD 16位,则被除数DX(高):AX(低)32位字位拓展指令CWD DX:AX/OPRD 放入AX,DX:AX%OPRD放入DX
例:用除法指令计算7FA2H/03DDH
MOV AX,7FA2H
MOV BX,03DDH
CWD ;AX扩展为DX=0000H,AX=7FA2H
DIV BX ;商=AX=0021H,余数=DX=0025H
3.3.3 逻辑运算与移位指令
1,逻辑运算指令
除NOT指令外,其余4条指令对操作数的要求与MOV指令相同,且使OF=CF=0,其余值不定
1)AND逻辑“与”指令
AND OPRD1,OPRD2 ;按位相与,仅1与1=1
作用之一:使目标操作数的某些位保持不变,把其他位清0
AND AL,0FH ;将AL中的高4位清0,低4位保持不变
作用之二;使操作数不变,但影响6个状态标志位,OF=CF=0
AND AX,AX
2)OR逻辑“或”指令
OR OPRD1,OPRD2 ;
作用之一:使目标操作数的某些位保持不变,将另外一些位置1
OR AL,20H ;将AL中的D5位置1,其余不变
作用之二:使操作数不变,但影响6个状态标志位,OF=CF=0
OR AX,AX
3)NOT逻辑“非”指令(对6个标志位均无影响)
NOT OPRD ;OPRD按位取反
OPRD 不能是立即数
NOT WORD PTR[SI]
4)XOR逻辑“异或”指令
XOR OPRD1,OPRD2 ;将两操作数按位进行“异或”
异或操作:两操作数相同时为0,不同时为1
作用:使某寄存器清零
XOR AX,AX ;使AX清零
5)TEST测试指令
TEST OPRD1,OPRD2 ;仅影响标志位,工作与AND相同
TEST AL,02H ;若AL中D1位为1,则ZF=0,否则ZF=1
2,移位指令(影响6个状态标志位)
作用:实现寄存器操作数或内存操作数进行指定次数的位移
移动1次,指令直接给出,2位及以上,移动位数要放在CL寄存器中。

1)非循环移位指令
算数移位指令针对有符号数,逻辑移位指令针对无符号数
SAL和SHL算数左移和逻辑左移执行完全相同的操作
SAL OPRD,1/CL
SHL OPRD,1/CL
将OPRD中的内容左移一位或CL位,每移一位,左边的最高位移入标志位CF,在最低位补零。

若移动一次,操作数的最高位和CF标志位状态不相同,则OF=1
状态相同,则OF=0
(判断移位前后的符号位是否一致。


例:MOV AL,41H
SHL AL,1
执行结果为AL=82H,CF=0,OF=1M若视AL为无符号数,则它没有溢出(82H<FFH)
若视AL为有符号数,则溢出(82H>7FH)
(原先AL是41H,而后移位后吗,D7位从0变为了1,产生了溢出。


例:把以DATA为首址的两个连续单元中的16位无符号数乘以10
LEA SI,DATA
MOV AX,[SI]
SHL AX,1 将二进制无符号数左移一位相当于将这个数乘以2
MOV BX,AX
MOV CL,2 左移两位,则乘以4
SHL AX,CL
ADD AX,BX
HLT
SHR逻辑右移指令
SHR OPRD,1/CL
OPRD顺序向右移1位或CL位,右边最低位移入CF,左边最高位补零
移动一次,若移动后的最高位与起先的不同,则OF=1,如果相同,则OF=0。

例:MOV AL,82H
SHR AL,1
执行结果:AL=41H,CF=0,OF=1
每逻辑右移一位,相当于无符号的目标操作数除以2,可以用SHR指令完成把一个数除以2^I的运算
SAR算数右移指令
SAR OPRD,1/CL
OPRD顺序向右移1位或CL位,右边最低位移入CF,左边最高位保持不变
不影响OF,AF
例:MOV AL,82H
SAR AL,1
执行结果:AL=C1H,CF=0。

2)循环移位指令
如果最高位与CF不相同,则OF=1;相同,则OF=0
ROL不带CF的循环左移指令
ROL OPRD,1/CL
OPRD向左移动1位或CL指定位,最高位移入CF,同时再移入最低位构成循环例:MOV AL,82H
ROL AL,1
执行结果:AL=05H,CF=1,OF=1
ROR不带CF的循环右移指令
ROR OPRD,1/CL
OPRD向右移动1位CL指定位,最低位移入CF,同时再移入最低高位构成循环例:MOV AL,82H
ROR AL,1
执行结果:AL=41H,OF=1,CF=0
RCL 带CF的循环左移指令
RCL OPRD,1/CL
OPRD连同CF一起向左移动1位或CL指定位,最高位进入CF,CF原来的值进入最后一位。

RCR带CF的循环右移指令
RCR OPRD,1/CL
OPED连同CF一起向右移动1位或CL 指定位,最低位进入CF,CF中原来的值进入最高位
4.1汇编语言源程序
机器语言:计算机硬件系统唯一能够直接理解和执行的语言
汇编语言:使用指令助记符,符号地址,标号和伪指令等来书写程序
4.2伪指令
4.2.1数据定义伪指令
1.格式:[变量名] 伪操作操作数[,操作数]
常用的数据定义伪指令有5种
(1)D B:定义变量为字节类型。

变量中的每个操作数都占一个字节(0~0FFH)。

DB伪指令也常用来定义字符串。

(2)D W:定义变量未字类型。

DW伪指令后面每个操作数都占用2个字节。

在内存中存放是,低字节低地址,高
字节高地址。

(3)D D:定义双字类型的变量。

DD伪指令后面的每个操作
数都占4个字节。

在内存中存放时,同样是低字节低地
址,高字节高地址。

(4)D Q:定义四字类型的变量。

(5)D T:定义十字节类型的变量。

DT伪操作后面的每个操作数都为10个字节的压缩BCD数。

2. 操作数
操作数(大于等于一个):常数,表达式或字符串
操作数的值不能超过由伪操作所定义的数据类型限定的范围例如:DB 操作数范围:0~255(无符号数)
-128~+127(有符号数)
字符和字符串都必须放在单引号中。

超过两个字符的字符串只能用DB指令。

DATA DB 11H,33H
NUM DW 100*5+88
STR DB ‘HELLO!’
DATA2 DW ?;为变量DATA2分配2个字节的空间,初始值为任意值。

SUM DQ 0011223344556677H DATA2 DW 11H,22H,3344H 由低到高存入
最下面的最高
77H 00H
66H 11H
55H 00H
44H 22H
33H 44H
22H 33H
11H
00H
DATA1 DB 11H,22H,33H,44H DATA2 DB ‘ABCD’,66H 11H 41H ‘A’
22H 42H ‘B’
33H 43H ‘C’
44H 44H ‘D’
66H
DATA3 DD 11H*2,22H,33445566H
22H
00H
00H
00H
22H
00H
00H
00H
33H
44H
55H
66H
3.重复操作符DUP
DATA1 DB 20 DUP(?);为变量DATA1分配20个字节的空间,初始值为任意值
DATA3 DB 20 DUP(30H);为变量DATA3分配20个字节的空间,初值均为30H
例4-3
4.2.2 符号定义伪指令。

相关文档
最新文档