FLAGS标志寄存器剖析Word文档格式.docx
《FLAGS标志寄存器剖析Word文档格式.docx》由会员分享,可在线阅读,更多相关《FLAGS标志寄存器剖析Word文档格式.docx(10页珍藏版)》请在冰豆网上搜索。
CF
指令对操作数的要求:
单操作数指令中的操作数不允许使用立即数
双操作数指令中,立即数只能作为源操作数,不允许源操作数和目的操作数都是存储器。
1,加法运算指令(不允许段寄存器作为操作数和两个都是存储器)
1)ADD普通加法指令(对全部6个状态标志位都会产生影响)
ADDOPRD1,OPRD2;
OPRD1+OPRD2送到OPRD1中去
ADD[SI],[BX]是错误的;
不允许两个操作数都是存储器操作数
例:
MOVAL,7EH
ADDAL,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个状态标志位都会产生影响)
ADCOPRD1,OPRD2;
OPRD1+OPRD2+CF送到OPRD1中去
设CF=1,写出以下指令执行后的结果
ADCAL,0ABH
指令执行后:
AL=7EH+0ABH+1=2AH,且CF=1
3)INC加1指令(不影响CF,影响其它5个状态标志)
INCOPRD;
OPRD+1送到OPRD中去
OPRD不能是立即数
通常用于在循环程序中修改地址指针及循环次数
2,减法指令(不允许段寄存器作为操作数和两个都是存储器)
1)SUB不考虑借位的减法指令(对全部6个状态标志位都会产生影响)
SUBOPRD1,OPRD2
不允许两个操作数都是存储器操作数
例:
SUBAL,[BP+SI];
将SS:
[BP+SI]单元的内容送到AL中去
基址变址寻址:
基址:
BX或BP变址:
SI或DI
DS[BX][变址]
SS[BP][变址]
2)SBB考虑借位的减法指令(对全部6个状态标志位都会产生影响)
SUBOPRD1,OPRD2;
将OPRD1-OPRD2-CF送到OPRD1中
3)DEC减1指令(不影响CF,影响其它5个状态标志)
DECOPRD
4)NEG求补指令(对全部6个状态标志位都会产生影响)
NEGOPRD(求负数的绝对值);
用0-OPRD
CF通常为1,除非OPRD为0
OF通常为0,除非OPRD为80H(-128)或8000H(-32768),执行后操作数不变,但是OF为1。
5)CMP比较指令(仅影响6个状态标志位)
CMPOPRD1,OPRD2;
OPRD1-OPRD2,结果不送回OPRD1
比较两个操作数的大小关系。
相等:
ZF=1
不相等:
无符号数,CMPAX,BXCF=0,AX>
BX
CF=1,AX<
BX
有符号数,CMPAX,BXSF,OF相同,AX>
SF,OF不同,AX<
例:
3-24在内存数据段从DATA开始的单元中存放了两个8位无符号数,试比较他们的大小,并将大的数送MAX单元、
LEABX,DATA
MOVEAL,[BX]
INCBX
CMPAL,[BX]
JNCDONE
MOVAL,[BX]
DONE:
MOVMAX,AL
HLT
3,乘法指令
MUL无符号乘法指令(影响CF和OF)
MULOPRD隐含寻址方式,隐含目标操作数AX(DX),源操作数由指令给出。
字节乘法:
OPRD*AL送到AX中
字乘法:
OPRD*AX送到DX:
AX中
这里,源操作数OPRD可以是8位或16位的寄存器或存储器。
乘法指令要求两操作数字长相等,且不能为立即数。
MULBX;
用AX*BX送到DX:
MULBYTEPTR[SI];
AL*[SI]送到AX中
MULDL;
用AL*DL送到AX中
设AL=0FEH,CL=11H,两数均为无符号数,求AL与CL的乘积。
MULCL
指令执行后:
AX=10DEH,因AH中的结果不为零,故CF=OF=1。
乘积的高半部分不为0,则CF=OF=1,代表AH或DX中包含乘积的有效数字
高半部分为0,则CF=OF=0
4,除法指令
DIV无符号数除法指令(对6个标志位均无影响)
DIVOPRD隐含寻址方式,隐含了被除数,除数OPRD不能为立即数
除数OPRD8位,则被除数AX16位字位拓展指令CBW
AX/OPRD放入AL,AX%OPRD放入AH
除数OPRD16位,则被除数DX(高):
AX(低)32位字位拓展指令CWD
DX:
AX/OPRD放入AX,DX:
AX%OPRD放入DX
用除法指令计算7FA2H/03DDH
MOVAX,7FA2H
MOVBX,03DDH
CWD;
AX扩展为DX=0000H,AX=7FA2H
DIVBX;
商=AX=0021H,余数=DX=0025H
3.3.3逻辑运算与移位指令
1,逻辑运算指令
除NOT指令外,其余4条指令对操作数的要求与MOV指令相同,且使OF=CF=0,其余值不定
1)AND逻辑“与”指令
ANDOPRD1,OPRD2;
按位相与,仅1与1=1
作用之一:
使目标操作数的某些位保持不变,把其他位清0
ANDAL,0FH;
将AL中的高4位清0,低4位保持不变
作用之二;
使操作数不变,但影响6个状态标志位,OF=CF=0
ANDAX,AX
2)OR逻辑“或”指令
OROPRD1,OPRD2;
使目标操作数的某些位保持不变,将另外一些位置1
ORAL,20H;
将AL中的D5位置1,其余不变
作用之二:
ORAX,AX
3)NOT逻辑“非”指令(对6个标志位均无影响)
NOTOPRD;
OPRD按位取反
OPRD不能是立即数
NOTWORDPTR[SI]
4)XOR逻辑“异或”指令
XOROPRD1,OPRD2;
将两操作数按位进行“异或”
异或操作:
两操作数相同时为0,不同时为1
作用:
使某寄存器清零
XORAX,AX;
使AX清零
5)TEST测试指令
TESTOPRD1,OPRD2;
仅影响标志位,工作与AND相同
TESTAL,02H;
若AL中D1位为1,则ZF=0,否则ZF=1
2,移位指令(影响6个状态标志位)
实现寄存器操作数或内存操作数进行指定次数的位移
移动1次,指令直接给出,2位及以上,移动位数要放在CL寄存器中。
1)非循环移位指令
算数移位指令针对有符号数,逻辑移位指令针对无符号数
SAL和SHL算数左移和逻辑左移执行完全相同的操作
SALOPRD,1/CL
SHLOPRD,1/CL
将OPRD中的内容左移一位或CL位,每移一位,左边的最高位移入标志位CF,在最低位补零。
若移动一次,操作数的最高位和CF标志位状态不相同,则OF=1
状态相同,则OF=0
(判断移位前后的符号位是否一致。
)
MOVAL,41H
SHLAL,1
执行结果为AL=82H,CF=0,OF=1M若视AL为无符号数,则它没有溢出(82H<
FFH)
若视AL为有符号数,则溢出(82H>
7FH)
(原先AL是41H,而后移位后吗,D7位从0变为了1,产生了溢出。
把以DATA为首址的两个连续单元中的16位无符号数乘以10
LEASI,DATA
MOVAX,[SI]
SHLAX,1将二进制无符号数左移一位相当于将这个数乘以2
MOVBX,AX
MOVCL,2左移两位,则乘以4
SHLAX,CL
ADDAX,BX
HLT
SHR逻辑右移指令
SHROPRD,1/CL
OPRD顺序向右移1位或CL位,右边最低位移入CF,左边最高位补零
移动一次,若移动后的最高位与起先的不同,则OF=1,如果相同,则OF=0。
MOVAL,82H
SHRAL,1
执行结果:
AL=41H,CF=0,OF=1
每逻辑右移一位,相当于无符号的目标操作数除以2,可以用SHR指令完成把一个数除以2^I的运算
SAR算数右移指令
SAROPRD,1/CL
OPRD顺序向右移1位或CL位,右边最低位移入CF,左边最高位保持不变
不影响OF,AF
SARAL,1
AL=C1H,CF=0。
2)循环移位指令
如果最高位与CF不相同,则OF=1;
相同,则OF=0
ROL不带CF的循环左移指令
ROLOPRD,1/CL
OPRD向左移动1位或CL指定位,最高位移入CF,同时再移入最低位构成循环
ROLAL,1
执行结果:
AL=05H,CF=1,OF=1
ROR不带CF的循环右移指令
ROROPRD,1/CL
OPRD向右移动1位CL指定位,最低位移入CF,同时再移入最低高位构成循环
RORAL,1
AL=41H,OF=1,CF=0
RCL带CF的循环左移指令
RCLOPRD,1/CL
OPRD连同CF一起向左移动1位或CL指定位,最高位进入CF,CF原来的值进入最后一位。
RCR带CF的循环右移指令
RCROPRD,1/CL
OPED连同CF一起向右移动1位或CL指定位,最低位进入CF,CF中原来的值进入最高位
4.1汇编语言源程序
机器语言:
计算机硬件系统唯一能够直接理解和执行的语言
汇编语言:
使用指令助记符,符号地址,标号和伪指令等来书写程序
4.2伪指令
4.2.1数据定义伪指令
1.格式:
[变量名]伪操作操作数[,操作数]
常用的数据定义伪指令有5种
(1)DB:
定义变量为字节类型。
变量中的每个操作数都占一个字节(0~0FFH)。
DB伪指令也常用来定义字符串。
(2)DW:
定义变量未字类型。
DW伪指令后面每个操作数都占用2个字节。
在内存中存放是,低字节低地址,高字节高地址。
(3)DD:
定义双字类型的变量。
DD伪指令后面的每个操作数都占4个字节。
在内存中存放时,同样是低字节低地址,高字节高地址。
(4)DQ:
定义四字类型的变量。
(5)DT:
定义十字节类型的变量。
DT伪操作后面的每个操作数都为10个字节的压缩BCD数。
2.操作数
操作数(大于等于一个):
常数,表达式或字符串
操作数的值不能超过由伪操作所定义的数据类型限定的范围
例如:
DB操作数范围:
0~255(无符号数)
-128~+127(有符号数)
字符和字符串都必须放在单引号中。
超过两个字符的字符串只能用DB指令。
DATADB11H,33H
NUMDW100*5+88
STRDB‘HELLO!
’
DATA2DW?
;
为变量DATA2分配2个字节的空间,初始值为任意值。
SUMDQ0011223344556677HDATA2DW11H,22H,3344H
由低到高存入
最下面的最高
77H00H
66H11H
55H00H
44H22H
33H44H
22H33H
11H
00H
DATA1DB11H,22H,33H,44HDATA2DB‘ABCD’,66H
11H41H‘A’
22H42H‘B’
33H43H‘C’
44H44H‘D’
66H
DATA3DD11H*2,22H,33445566H
22H
33H
44H
55H
66H
3.重复操作符DUP
DATA1DB20DUP(?
);
为变量DATA1分配20个字节的空间,初始值为任意值
DATA3DB20DUP(30H);
为变量DATA3分配20个字节的空间,初值均为30H
例4-3
4.2.2符号定义伪指令