汇编笔记3.docx
- 文档编号:8576604
- 上传时间:2023-01-31
- 格式:DOCX
- 页数:28
- 大小:47.48KB
汇编笔记3.docx
《汇编笔记3.docx》由会员分享,可在线阅读,更多相关《汇编笔记3.docx(28页珍藏版)》请在冰豆网上搜索。
汇编笔记3
算术运算指令可处理4种类型的数1.无符号二进制整数2.带符号二进制整数
3.无符号压缩十进制整数(PackedDecimal)4.无符号非压缩十进制整数
一个8位二进制数可看成4种不同类型的数,所表示的数值亦不同。
数的表示:
二进制数:
可以是8位或16位,若是带符号数,则用补码表示。
压缩十进制数:
一个字节中存放两个BCD码十进制数。
非压缩十进制数:
一字节的低半字节存放十进制数,高半字节为全零。
例如,对十进制数字58:
●压缩十进制数表示:
只需一个字节,即01011000B;
●非压缩十进制数表示:
需两个字节,即00000101B和00001000B。
二进制码(B)
十六进制(H)
无符号二进制(D)
带符号二进制(D)
非压缩十进制
压缩十进制
00000111
07
7
+7
7
07
10001001
89
137
-119
无效
89
11000101
C5
197
-59
无效
无效
1.加法指令(Addition)
⑴ADD加法指令(Addition)
指令格式:
ADD目的,源指令功能:
目的源十目的
⑵ADC带进位的加法指令(AdditionwithCarry)
指令格式:
ADC目的,源指令功能:
目的源十目的十CF
操作数的要求:
(包括上两条指令)
源操作数:
可以是寄存器、存储器、立即数;目的操作数:
只能用寄存器、存储单元。
注意:
★源、目的操作数不能同时为存储器,且类型必须一致,即都是字节或字,目的操作数不可以是立即数;
★这两条指令影响的标志位为:
CF、OF、PF、SF、ZF和AF。
例3.40两种加法指令的实例
ADDAL,18HALAL十18H
ADCBL,CLBLBL十CL十CF
ADCAX,DXAXAX十DX十CF
ADDAL,COST[BX]AL内容和地址=DS:
(COST+BX)的存储字节相加,结果送AL
ADDCOST[BX],BL将BL与物理地址=DS:
(COST十BX)的存储字节相加,结果留在该存储单元中
例3.41用加法指令对两个8位16进制数5EH和3CH求和,并分析加法运算指令执行后对标志位的影响。
解:
MOVAL,5EHAL=5EH(94)
MOVBL,3CHBL=3CH(60)
ADDAL,BL;结果AL=9AH
ADD对标志位的影响
▲两个数的相加过程:
010111105EH=94
+00111100即:
+3CH=60
100110109AH=154
标志位:
ZF=0,AF=1,CF=0,SF=l,PF=1,OF=1。
▲对标志的解释:
1.两个加数都看成无符号数时,运算结果为9AH,即十进制数154。
在这种情况下,SF和OF都没有意义,我们只关心ZF和CF标志,在BCD码运算或奇偶校验时才考虑AF或PF标志。
2.两个加数都当成带符号数时,符号标志SF和溢出标志OF很重要,而进位标志CF没有意义。
带符号数能表示的范围-128~+127,而本例中,两个正数94和60相加,其和为154,由于154超过了范围,
即产生了溢出,OF=1
⑶INC增量指令(Increment)
指令格式:
INC目的指令功能:
目的目的十1
操作数的要求:
通用寄存器、内存。
注意:
▲这条指令主要用在循环程序中,对地址指针和循环计数器等进行修改;
▲指令执行后影响AF、OF、PF、SF和ZF,但不影响进位标志CF。
▲该指令只有一个操作数时,如果要使内存单元的内容增1,程序中必须说明该存储单元是字还是字节。
INC指令的两个应用例子:
例3.42INCBL;BL寄存器中内容增1例3.43INCBYTEPTR[BX];内存字节单元内容增1
INCCX;CX寄存器中内容增1INCWORDPTR[BX];内存字单元内容增1
其中:
PTR为类型说明符,前面加BYTE说明操作数类型为字节,加WORD则说明操作数类型为字。
⑷AAA加法的ASCII调整指令(ASCIIAdjustforAddition)
指令格式:
AAA指令功能:
将AL寄存器中的运算结果调整为1位非压缩十进制数,仍保留在AL。
如果AF=1,表示向高位有进位,则进到AH寄存器中。
使用前提:
用ADD或ADC指令对两个非压缩十进制数或ASCII码表示的十进制数作加法,运算结果已存在AL。
(注:
非压缩十进制数的高4位为全0,低4位为十进制数字0~9。
例如,将9表示成00001001)
调整过程:
若AL低4位>9或AF=1
则:
①ALAL十6否则:
将AL寄存器的高4位清0。
②用与操作(∧)将AL高4位清0
③AF置1,CF置1,AHAH十l
例3.44若AL=BCD9,BL=BCD5,求两数之和。
解:
设AH=0,则运算过程如下:
ADDAL,BL;00001001……09H
;+00000101……05H
;______________________________
AAA;00001110……低4位>9
;+00000110……加6调整
;______________________________
;00010100
;∧00001111……清高4位
;______________________________
;00000100……AL=04HCF=1,AF=1,AH=1结果为AX=0104H,表示非压缩十进制数14
ASCII码表示的十进制数,高半字节均为3,运算时需用AND指令将它屏蔽。
只要使用AAA指令,可以不必屏蔽高半字节,便能在AX中得到一个正确的非压缩十进制数。
例3.45求ASCII码表示的数9(39H)与5(35H)之和。
解:
设AH=0,则运算过程如下:
MOVAL,‘9’;AL=39H
MOVBL,‘5’;BL=35H
ADDAL,BL;00111001……‘9’
;+00110101……‘5’
;______________________________
AAA;01101110……低4位>9
;+00000110……加6调整
;______________________________
;01110100
;∧00001111……清高4位
;______________________________
;00000100……AL=4CF=1,AF=1,AH=1结果为AX=0104H,表示非压缩十进制数14
在AAA指令后加上一条“或”指令ORAX,3030H,便使AX中的结果变成了ACSII码3134H。
⑸DAA加法的十进制调整指令(DecimalAdjustforAddition)
指令格式:
DAA指令功能:
将两个压缩BCD数相加后的结果调整为正确的压缩BCD数。
使用前提:
相加后的结果必须在AL中,才能使用DAA指令。
调整过程:
1.若AL的低4位>9或AF=1,则ALAL十6,对低4位进行调整;
2.若AL的高4位>9或CF=1,则ALAL十60H,对高4位进行调整,并使CF置1,否则CF置0。
例3.46若AL=BCD38,BL=BCDl5,求两数之和。
解:
运其过程如下:
ADDAL,BL;00111000……38H
;+00010101……15H
;______________________________
DAA;01001101……低4位>9
;+00000110……加6调整
;______________________________
;01010011……AL=53H结果为:
AL=BCD53,CF=0
调整过程:
①若AL的低4位>9或AF=1,则ALAL十6,对低4位进行调整;
②若AL的高4位>9或CF=1,则ALAL十60H,对高4位进行调整,并使CF置1,否则CF置0。
例3.47若AL=BCD88,BL=BCD49,求两数之和。
解:
运算过程为:
ADDAL,BL;10001000……88H
;+01001001……49H
;______________________________
DAA;11010001……AF=1,低4位<9
;+00000110……加6调整
;______________________________
;11010111……调整后,高4位>9
;+01100000……加60H调整
;______________________________
;00110111……AL=37H结果为:
AL=BCD37,CF=1
调整过程:
①若AL的低4位>9或AF=1,则ALAL十6,对低4位进行调整;
②若AL的高4位>9或CF=1,则ALAL十60H,对高4位进行调整,并使CF置1,否则CF置0。
2.减法指令(Subtraction)
⑴SUB减法指令(Subtraction)
指令格式:
SUB目的,源指令功能:
目的目的-源
例3.48SUBAX,BX;AXAX-BXSUBDX,1850H;DXDX-1850H
⑵SBB带借位的减法指令(SubtractwithBorrow)
指令格式:
SUBB目的,源指令功能:
目的目的-源-CF(SBB主要用于多字节减法中)
例3.49SUBBAL,CL;ALAL-CL-CF
⑶DEC减量指令(Decrement)
指令格式:
DEC目的指令功能;目的目的-l
例3.50
DECBX;BXBX-1DECWORDPTR[BP];堆栈段中位于[BP]偏置处的字减1
⑷NEG取补指令(Negate)
指令格式:
NEG目的指令功能:
目的0-目的,即:
对目的操作数取补
例3.51NEGAX;将AX中的数取负NEGBYTEPTR[BX];对数据段中位于[BX]偏置处的字节取负
⑸CMP比较指令(Compare)
指令格式:
CMP目的,源指令功能:
目的-源
注意:
结果不回送到目的操作数中,仅反映在标志位上。
用途:
用在比较两个数大小又不破坏原操作数的场合。
例3.52CMPAL,80H;AL与80H作比较CMPBX,DATA1;BX与数据段中偏移量为DATA1处的字比较
减法指令小结:
(上述五种指令都做减法运算)
①对于双操作数指令(SUB、SBB、CMP):
▲源操作数可以是寄存器、存储器或立即数;
▲目的操作数可以是寄存器、存储器,但不能为立即数;
▲两个操作数不能同时为存储器。
②对于单操作数指令(DEC、NEG):
▲目的操作数可以是寄存器、存储器,但不能为立即数;
▲如果是存储器操作数,还必须说明其类型是字节还是字。
3运算之后,除DEC指令不影响CF标志外,它们均影响OF、SF、ZF、AF、PF和CF标志。
在减法操作后,如果源操作数大于目的操作数,需要借位时,进位/借位标志CF将被置1。
例3.53设AL=10110001B,DL=01001010B,求AL-DL。
解:
SUBAL,DL;与加法操作一样,对结果的解释取决于参与运算的数的性质
运算过程如下:
二进制减法当成无符号数当成带符号数
10110001177-79
-01001010-74-)+74
----------------------------------------------------
01100111103+103
运算后标志位:
ZF=0,AF=1,CF=0,SF=0,PF=0,OF=1
讨论:
▲两数为无符号数:
表示177与74的差是103。
CF=0表示没有借位,SF和OF无意义。
▲两数为带符号数:
表示-79-(+74),结果应为-153。
但结果却为正数(103),这是由于-153溢出造成的。
此时,SF和OF有重要意义。
3.乘法指令(Multiply):
⑴MUL无符号数乘法指令
指令格式:
MUL源指令功能:
把源操作数和累加器中的数都当成无符号数,然后将两数相乘。
▲源操作数是一个字节:
AXAL*源。
(即:
原操作数与累加器AL中的内容相乘,乘积为双倍长的16位数,高8位送到AH,低8位送AL。
)
▲源操作数是一个字:
(DX,AX)AX*源
(即:
原操作数与累加器AX的内容相乘,结果为32位数,高位字放在DX寄存器中,低位字放在AX寄存器中。
)
操作数要求:
可以是寄存器、存储单元,但不能是立即数;源操作数可以是字节或字;
源操作数是存储单元时,必须在操作数前加BYTEPTR或WORDPTR说明是字节还是字。
例3.56MULDL;AXAL*DLMULCX;(DX,AX)AX*CX
MULBYTEPTR[SI];AXAL*(内存中某字节),B说明字节乘法
MULWORDPTR[BX];(DX,AX)AX*(内存中某字),W说明字乘法
注意:
▲MUL指令执行后影响CF和OF标志。
如果结果的高半部分(字节操作为AH、字操作为DX)不为零,表明其内容是结果的有效位,则CF和OF均置1。
否则,CF和OF均清0。
据此可检测并去除结果中的无效前导零。
▲乘法指令使AF、PF、SF和ZF的状态不定。
例3.58试计算FFH×FFH。
解:
用二进制表示成如下形式:
▲作为无符号数:
表示255×255=65025,结果正确。
▲作为带符号数:
表示(-1)×(-1)=-511,显然结果不正确。
▲可见,用MUL指令作带符号数的乘法,会得到错误的结果;
用IMUL指令,才能使(一1)×(一1)得到正确的结果0000000000000001。
⑵IMUL有符号数乘法指令
指令格式:
IMUL源指令功能:
把源操作数和累加器中的数都作为带符号数,进行相乘。
注意:
▲存放结果的方式与MUL相同:
1.源操作数为字节:
与AL相乘,双倍长结果送到AX中;2.源操作数为字:
与AX相乘,双倍长结果送到DX和AX中,最后给乘积赋予正确的符号。
▲对标志位的影响:
1.乘积的高半部分不是全零或全1,则不是低半部分的符号扩展,那么高位部分就为有效位,表示它是积的一部分,于是置CF=1,OF=1;2.结果的高半部分为全零或全1,表明它仅包含了符号位,那么使CF=0,OF=0。
AF、PF、SF和ZF不定。
例3.59设AL=-28,BL=59,试计算它们的乘积。
解:
IMULBL结果:
1652D=0000011001110100B=0674H-1652D=1111100110001100B=F98CH
则,CF=1,OF=1AX=F98CH=-1652
⑶AAM乘法的(ASCII)调整指令(ASCIIAdjustforMultiply)
指令格式:
AAM
指令功能:
对AL中的两个非压缩十进制数相乘的乘积进行十进制数的调整,在AX中得到正确的非压缩十进制数的乘积,高位在AH中,低位在AL中。
注意:
▲两个ASCII码数相乘之前,先屏蔽掉每个数字的高半字节,使每个字节包含一个非压缩十进制数(BCD数),再用MUL指令相乘,乘积放到AL寄存器中,然后用AAM指令进行调整。
▲标志位的影响:
影响ZF、SF和PF,但AF、CF和OF无定义。
▲8086/8088指令系统中,十进制乘法运算不允许采用压缩十进制数,调整指令仅此一条。
▲只能进行8位数的乘法
调整过程:
把AL寄存器内容除以10,商放在AH中,余数在AL中。
即AHAL/10所得的商;ALAH/10所得的余数。
例3.60求两个非压缩十进制数9和6之乘积。
解:
MOVAL,09H;置初值
MOVBL,06H
MULBL;AL09与06之乘积36H=54
AAM;调整得AH=36H/0AH=05H(十位),;AL=36H%0AH=04H(个位)
结果:
AX=0504H,即BCD数54。
如果AL和BL中分别存放9和6的ASCII码,求两数之积。
解:
用以下指令实现:
ANDAL,0FH;屏蔽高半字节
ANDBL,0FH
MULBL;相乘
AAM;调整
如要将结果转换成ASCII码,可用指令ORAX,3030H实现,使AX=3534H。
4.除法指令(Division):
⑴DIV无符号数除法指令(Division,unsigned)
指令格式:
DIV源指令功能:
对两个无符号二进制数进行除法操作。
▲源操作数为字节,16位被除数必须放在AX中,8位除数为源操作数。
ALAX/源(字节)的商AHAX/源(字节)的余数
若被除数只有8位,必须把它放在AL中,并将AH清0。
▲源操作数为字,32位被除数在(DX,AX)中,16位除数作源操作数。
AX(DX,AX)/源(字)的商DX(DX,AX)/源(字)的余数
若被除数、除数都是16位,则将16位被除数送到AX中,再将DX寄存器清0。
注意:
▲源操作数可以是寄存器、存储单元;可以是字,也可以是字节;但不能是立即数
▲被除数和除数一样,商和余数也都为无符号数。
▲DIV指令执行后,所有标志位均无定义。
⑵IDIV有符号数除法指令(IntegerDivision)
指令格式:
IDIV源指令功能:
对两个带符号二进制数进行除法操作(也称为带符号数除法)
注意:
▲商和余数都是带符号数,且规定余数的符号和被除数的相同;
▲指令执行后,所有标志位均无定义。
▲无论对(DIV)还是(IDIV),都要注意溢出问题:
1.字节操作时:
被除数的高8位绝对值大于除数的绝对值,产生溢出。
即商数超过了目标寄存器AL所能存放数的范围:
对于无符号数,允许最大商为FFH;对于带符号数,允许商的范围为-127~+127,或-81H~+7FH;
2.字操作时:
被除数的高16位绝对值大于除数的绝对值,产生溢出。
即商数超过了目标寄存器AX所能存放数的范围:
对于无符号数,允许最大商为FFFFH;对于带符号数,允许商的范围为-32767~+327或-8001H~7FFFH。
▲溢出时计算机会自动产生一个中断类型号为0的除法错中断,相当于执行了除数为0的运算,所得的商和余数都不确定。
▲带符号数除法指令:
字节操作时要求被除数为16位;字操作时要求被除数为32位;
如果被除数不满足这个条件,不能简单地将高位置0,而应该用符号扩展指令(SignExtension)将被除数转换成除法指令所要求的格式。
例3.61两个无符号数7A86H和04H相除,商应为多少?
解:
MOVAX,7A86H
MOVBL,04H
DIVBL
结果:
①正确的商应为1EA1H。
②由于BL中的除数04H为字节,被除数为字,商1EA1H大于AL中能存放的最大无符号数FFH,产生除法错误中断。
⑶CBW把字节转换为字指令(ConvertBytetoWord)
指令格式:
CBW指令功能:
把寄存器AL中字节的符号位扩充到AH的所有位。
(AH被称为AL的符号扩充)
扩展方法:
▲若AL中的D7=0,则将这个0扩展到AH中,使AH=00H,即:
▲若AL中的D7=1,则将这个1扩展到AH中,使AH=FFH,即:
注意:
CBW指令执行后,不影响标志位。
例编程求-38/3的商和余数。
解:
MOVAL,11011010B;被除数:
-38的补码
MOVCH,00000003B;除数:
+3
CBW;将AL符号扩展到AH中,;使AX=111111111101;1010B
IDIVCH;AX/CH,AL=11110100B;=-12(商),;AH=11111110=-2(余数)
⑷CWD把字转换成双字指令(ConvertWordtoDoubleWord)
指令格式:
CWD指令功能:
把AX中字的符号值扩充到DX寄存器的所有位。
扩展方法:
▲若AX的D15=0,则DX0000H,即:
▲若AX的D15=1,则DXFFFFH,即:
注意:
CWD指令执行后,也不影响标志位。
⑸AAD除法的(ASCII)调整指令(ASCIIAdjustforDivision)
指令格式:
AAD指令功能:
在做除法前,把AX中非压缩BCD码转换成二进制数。
调整过程:
ALAH×10+ALAH00
注意:
▲AX中的两位非压缩格式的BCD数除以一个非压缩的BCD数前,要先用AAD指令把AX中的被除数调整成二进制数,并存到AL中,才能用DIV指令进行运算。
▲根据AL寄存器结果影响SF、ZF、PF,但对OF、CF、AF无定义。
例3.63设AX中存有两个非压缩BCD数0307H,即十进制数的37,BL中存有一个非压缩BCD数05H,编程完成AX/BL的运算。
解:
AAD;AL03×10+7=37=25H
DIVBL;AL=7(商),AH=2(余数)
MOVCL,AH;腾出AH
AAM;将2进制数转成非压缩BCD码
逻辑运算
指令的特点:
逻辑运算均是按位操作的,所以操作数被看成串。
源操作数可以是:
立即数、通用寄存器、存储器
目的操作数可以是:
通用寄存器、存储器但是不能同时为存储器
结果的影响:
除了“非”(NOT)指令对FR不影响,其他指令均影响SF、ZF、PF,使CF=OF=0;
逻辑运算
NOT
取反
AND
逻辑乘(与)
OR
逻辑加(或)
XOR
异或
TEST
测试
1NOT取反指令(LogicalNot)
指令格式:
NOT目的指令功能:
目的目的取反
操作数要求:
①可以是8位或16位寄存器、存储器。
②对于存储器操作,需指明是字还是字节。
注意:
指令执行后,对标志位无影响
例3.65NOTAX;AXAX取反
NOTBL;BLBL取反
NOTBYTEPTR[BX];对存储单元内容取反后
;送回该单元
2AND逻辑与指令(LogicalAND)
指令格式:
AND目的,源指令功能:
目的目的∧源
例3.66假设AX中存有数字5和8的ASCII码,即AX=3538H,将它们
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 笔记