第10章二进制算术运算.ppt
《第10章二进制算术运算.ppt》由会员分享,可在线阅读,更多相关《第10章二进制算术运算.ppt(94页珍藏版)》请在三一文库上搜索。
1、第10章 二进制算术运算,10.1 加法与减法指令(ADD与SUB) 10.2 无符号数与带符号数 10.3 乘法 10.4 除法 10.5 改变符号和符号扩展指令 10.6 寻址与加、减法运算练习,10.1 加法与减法指令(ADD与SUB),ADD与SUB指令是加法与减法指令,可进行二进制数的字节或字的加、减运算。加法运算与手工加法相似,按逢二进一求和。而对于减法运算,计算机是利用对减数求补与被减数相加的方法来处理。方法是:将第二个操作数(减数),每一位变反(01或10),然后加1,这个过程称为求补;最后再与第一个操作数(被减数)相加。对于操作数的寻址有下列五种可能:,立即数与存储器的加/减
2、 立即数与寄存器的加/减 寄存器与寄存器的加/减 寄存器与存储器的加/减 存储器与寄存器的加/减,例10.1 加法指令ADD与减法指令SUB的使用。其中,子程序B10ADD使用ADD指令来处理字节的相加,C10SUB使用SUB指令来处理字的相减。 源程序清单如下: ; filename:L101.ASM ; CODE SEGMENT ASSUME CS:CODE ,DS:CODE,SS:CODE,ORG 100H BEGIN: JMP SHORT MAIN ; BYTEA DB 64H ;数据定义,BYTEB DB 40H BYTEC DB 16H WORDA DW 4000H WORDB D
3、W 2000H WORDC DW 1000H ; MAIN PROC NEAR CALL B10ADD ;调用加法子程序 CALL C10SUB ;调用减法子程序,RET MAIN ENDP ; B10ADD PROC MOV AL,BYTEA MOV BL,BYTEB ADD AL,BL ;寄存器与寄存器 ADD AL,BYTEC ;存储器与寄存器 ADD BYTEA,BL ;寄存器与存储器,ADD BL,10H ;立即数与寄存器 ADD BYTEA,25H ;立即数与存储器 RET B10ADD ENDP ; C10SUB PROC MOV AX,WORDA MOV BX,WORDB SU
4、B AX,BX ;寄存器与寄存器,SUB AX,WORDC ;存储器与寄存器 SUB WORDA,BX ;寄存器与存储器 SUB BX,1000H ;立即数与寄存器 SUB WORDA,256H ;立即数与存储器 RET C10SUB ENDP ; CODE ENDS END BEGIN,因为不允许存储器与存储器之间直接进行数据运算,所以可以使用寄存器来作为中间桥梁。例如,WORDA与WORDB均定义成WORD(字),要将WORDA加到WORDB的运算,可以写出如下语句: MOV AX,WORDA ADD AX,WORDB MOV WORDB,AX,1. 溢出 一个字节所能表示的带符号二进制数
5、的范围为-128+127,当运算的结果超出这个范围时就称为溢出。通常的算术运算很容易超过一个字节寄存器的容量。例如,当寄存器AL中的和超过其最大容量时,不会自动地将溢出扩充到AH寄存器中。假设AL60H,若 ADD AL,20H,AL中将产生和的结果80H;同时设定溢出标志位CF1,符号标志位SF1。80H的二进制为10000000,表示为一个负数为-128。两个正数求和结果为负,这是为什么?问题的原因就是AL寄存器的容量太小,需要将和放在AX寄存器中。下列CBW指令可将字节转换成字,将AL中的60H根据其正负号扩展AH成为0060H存入AX中。这时ADD在AX中才能产生正确的结果:0080H
6、或+128。 CBW ;将AL扩展到AH ADD AX,20H ;20H加入AX中,2. 多字节加法 例10.2 多字节加法。 源程序清单如下:,; filename:L102.ASM 多字节加法 CODE SEGMENT PARA CODE ASSUME CS:CODE ,DS:CODE,SS:CODE ORG 100H BEGIN: JMP SHORT MAIN,; WORD1A DW 0123H ;数据定义 WORD1B DW 0BC62H WORD2A DW 0012H WORD2B DW 553AH WORD3A DW ? WORD3B DW ? ; ,MAIN PROC NEAR
7、CALL D10DWD ;调用加法子程序1 CALL E10DWD ;调用加法子程序2 RET MAIN ENDP,; 加法子程序1 D10DWD PROC MOV AX,WORD1B ADD AX,WORD2B MOV WORD3B,AX MOV AX,WORD1A ADC AX,WORD2A MOV WORD3A,AX RET,D10DWD ENDP ; 加法子程序2 E10DWD PROC CLC MOV CX,02 LEA SI,WORD1B LEA DI,WORD2B LEA BX,WORD3B E20: MOV AX,SI,ADC AX,DI MOV BX,AX DEC SI ;寄
8、存器与寄存器 DEC SI ;存储器与寄存器 DEC DI DEC DI DEC BX DEC BX,LOOP E20 ;寄存器与存储器 RET E10DWD ENDP CODE ENDS END BEGIN,例10.2 进行的是0123BC62+0012553A。例10.2中,加法子程序1 (D10DWD)将一对字(WORD1A与WORD1B)加到第二对字(WORD2A与WORD2B),将和存到第三对字(WORD3A与WORD3B)中。运算先加最低的字:,WORD1B BC62 WORD2B 553A 和 1119C,和为十六进制1119C,超过了AX寄存器的无符号数最大容量,进位标志CF1
9、。下面将高字相加,ADC指令连同进位CF一起求和。,WORD1A 0123 WORD2A 0012 CF 1 和 0136,使用DEBUG追踪该算术运算,将会观察到AX中存有0136,WORD3A存有3601,WORD3B存有9C11。 例10.2中,加法子程序2(E10DWD)可以作任意长度的加法。从数据的最低位开始加起,第一次循环加最低的字,第二次循环加次低的字,所以,SI、DI、BX的内容需要减2。可以用两条DEC减1指令,实现递减的运算。请注意,指令 SUB 寄存器,02 将会影响标志位,清除进位标志CF,产生不正确的结果。,因为使用循环,所以仅使用一次加法指令ADC。开始的CLC指令
10、将进位标志CF清为0。使用循环的方法有如下要求: 字的定义必须是连续的; 由低地址到高地址处理; CX的初值为相加的字数。 多字的减法是用带借位的减法指令SBB取代ADC,就是将子程序2(E10DWD)中的ADC以SBB取代。,10.2 无符号数与带符号数,某些数是无符号的,例如用户编号和日期。某些数是带符号的数,例如用户应付的金额,温度的读数可能包含正值或负值。又例如产品价格和付款值永远都被认定为正值。 表10-1给出了与寄存器宽度相匹配的无符号和带符号数据的最大值。,表10-1 无符号数与带符号数的最大值,对于不带符号的数,所有的位都表示数。8位寄存器可容纳的最大值是255(28-1),1
11、6位寄存器可容纳的最大值是65 535(216-1)。带正负号的数最高位表示正负号。在计算机中加、减法指令对于是否有正负号并不加以区别,而是所有的位都作加、减运算。下列为两个二进制数相加,第一个数最高位为1,对于不带符号的数,代表249,如果是带符号数,则表示为-7:,无符号数 带符号数 1111 1001 249 7 0000 0010 2 +2 1111 1011 251 5,带正负号与不带正负符号的运算结果是相同的。然而不带符号的结果是251,带符号的结果是-5。但是,其中总有一个应是你所需要的。 当不带符号数的和产生进位(CF1)时,其结果不正确。,无符号数 带符号数 CF OF 11
12、11 1100 252 -4 0000 0101 5 +5 0000 0001 1 +1 1 0 不正确,当有符号数的和有进位给符号位却没有产生最高位进位,或没有进位给符号位却有最高位的进位时,其结果不正确即有溢出。 无符号数 带符号数 CF OF 0111 1001 121 +121 0000 1011 11 +11 1000 0100 132 -124 0 1 不正确,进位和溢出同时发生的情况如下: 无符号数 带符号数 CF OF 1111 0110 246 -10 1000 1001 137 -119 0111 1111 127 +127 1 1 不正确 不正确,10.3 乘 法,对于乘
13、法,MUL指令用于处理无符号数乘法,IMUL用来处理带符号数乘法。作为一个程序设计员,你必须控制所处理的数据格式并选择适当的指令。两个基本的乘法运算如下:,1. 字节乘字节 被乘数放在AL寄存器中,乘数放在寄存器或存储器的一个字节单元中(OPR),将乘积放在AX寄存器中。此运算会清除原存放在AH中的数据。如图10-1中的OPR是指令中的操作数,若OPR是字节型数据,AL的值与OPR相乘,16位的乘积放到AX中。,图10-1 字节乘法,2. 字乘字 被乘数放在AX寄存器中,乘数放在寄存器或存储器的一个字单元中,将结果乘积的高16位部分放在DX中,低16位部分放在AX中。此运算将会清除原存于DX中
14、的数据。若OPR是字型数据,把AX的值与OPR相乘,32位的乘积放到DX与AX中;DX放乘积的高16位,AX放乘积的低16位,如图10-2所示。,图10-2 字乘法,MUL与IMUL指令中仅指定一个操作数(乘数)。指令如下: MUL MULTR ;MULTR是存储器单元 指令默认被乘数一定放在AL或AX中,乘积的存放位置也是由指令本身确定的。这种由指令本身限定必须使用的操作数,称为隐含操作数。乘法中的乘数则需要在指令中用操作数的形式指明。如果MULTR定义为DB,则假设AL乘以字节数据;如果MULTR定义为DW,则假设AX乘以字数据。,当乘数放在寄存器中时,寄存器的长度决定运算数据的类型,如下
15、所示: MUL CL ;1字节数据相乘:被乘数放在AL,乘积放在AX MUL BX ;1字数据相乘:被乘数放在AX,乘积放在DX:AX,10.3.1 无符号数乘法指令MUL MUL指令用作无符号数的相乘。例10.3中C10MUL给出三个乘法的例子:字节乘以字节,字乘以字和字乘以字节。第一个例子为十六进制80(128)与十六进制40(64)两数相乘,乘积十六进制2000(8192)放在AX中。第二个例子所产生的乘积为十六进制10000000,存放在DX:AX中。,例10.3 乘法指令范例。 源程序清单如下: ; filename:L103.ASM 乘法范例 TITLE EXMULT(COM )
16、Example MUL & IMUL operations CODESG SEGMENT PARA CODE ASSUME CS:CODESG, DS:CODESG, SS:CODESG ORG 100H,BEGIN: JMP SHORT MAIN ; BYTE1 DB 80H BYTE2 DB 40H WORD1 DW 8000H WORD2 DW 2000H,; MAIN PROC NEAR CALL C10MUL CALL D10IMUL RET MAIN ENDP ; Examples of MUL C10MUL PROC MOV AL, BYTE1,MUL BYTE2 MOV AX,
17、 WORD1 MUL WORD2 MOV AL, BYTE1 SUB AH, AH MUL WORD1 RET C10MUL ENDP,; Examples of IMUL D10IMUL PROC MOV AL, BYTE1 IMUL BYTE2 MOV AX, WORD1 IMUL WORD2 MOV AL,BYTE1 CBW,IMUL WORD1 RET D10IMUL ENDP CODESG ENDS END BEGIN 第三个例子是字与字节数据的乘,必须将BYTE1扩展为一个字数据。因为数值假设为无符号数,所以AH寄存器最高位假定为0,若使用CBW指令最高位可能是0或1。乘积存于DX
18、:AX中,为十六进制00400000。,10.3.2 带符号数乘法指令IMUL IMUL指令用来处理带符号数相乘。例10.3中D10IMUL使用类似C10MUL中的三个范例,将MUL以IMUL取代。 第一个例子中将十六进制80(负数)乘以十六进制40(正数)。乘积为十六进制E000,存入AX寄存器中。使用相同的数据,MUL则产生十六进制2000的结果。由此可以看出使用MUL与IMUL两者的差别。MUL将十六进制80看作+128,IMUL则认为80为-128。-128与64二者相乘的乘积为-8192,相当于十六进制的E000H。,第二个例子将十六进制8000(负数)乘以十六进制2000(正数)。
19、乘积为十六进制F0000000,存于DX:AX中,它是IMUL所产生的负值乘积。 第三个例子将AX中的BYTE1扩展为一个字数据。因为数值被假定为带符号数,所以此处必须使用CBW将最高位扩展到AH寄存器:在AL中的十六进制80,使AX中的十六进制数为FF80。,因为乘数WORD1也是负数,所以乘积为正。实际上在DX:AX中的十六进制00400000与MUL有相同的结果。MUL是假定两个正数相乘。 实际上,如果乘数与被乘数有相同的正负符号,则MUL与IMUL会产生相同的结果。但如果乘数与被乘数的正负符号不相同,则MUL产生一个正号的乘积,IMUL则产生一个负号的乘积。 你可以用DEBUG来追踪上
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 10 二进制 算术 运算
链接地址:https://www.31doc.com/p-2565520.html