汇编语言第5章1数值运算程序设计课件_第1页
汇编语言第5章1数值运算程序设计课件_第2页
汇编语言第5章1数值运算程序设计课件_第3页
汇编语言第5章1数值运算程序设计课件_第4页
汇编语言第5章1数值运算程序设计课件_第5页
已阅读5页,还剩31页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、5.1 两个多字节数的加减运算 这里所指的两个多字节数的加减运算, 包括二进制数的加减运算和组合的BCD数加减运算由于8088内部寄存器是16位的, 因此不能直接进行多字节数的加减运算。高位加法指令应采用ADC指令; 减法指令应采用SBB指令。 第第5章章 数值运算程序设计数值运算程序设计 1. 两个多字节数的二进制加法运算两个多字节数的二进制加法运算 例5.1 设多字节的被加数从FIRST单元开始存放, 多字节的加数从SECOND单元开始存放, 相加后的结果从DEST单元开始存放, 设字节数为5。 则程序如下: NAME EX051 ; MULTIPLE BYTES-ADDITION DAT

2、A SEGMENTFIRST DB 1AH, 25H, 4EH, 60H, 3DHSECOND DB 80H, 49H, 62H, AEH, 4EH DEST DB 5 DUP(?)DATA ENDS COSEG SEGMENT ASSUME CS:COSEG, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS, AX MOV ES, AX MOV SI, OFFSET FIRST MOV BX, OFFSET SECOND MOV DI, OFFSET DEST MOV CX, LENGTH DEST CLD CLC ADDHEX: LODSB FIRS

3、T ADC AL, BX STOSB DEST INC BX LOOP ADDHEX MOV AH, 4CH INT 21H COSEG ENDS END START 5.2 多字节乘法运算多字节乘法运算 设有两个32位二进制数, 相乘的结果将是一个64位范围内的二进制数。 如果将一个乘数分为两个字, 被乘数也分为两个字, 分别按字进行相乘。 例如被乘数的两个字分别为X1和X0, 乘数的两个字分别为Y和Y0, 则: Y=(Y1)(Y0)=(Y1)*216+(Y0) X=(X1)(X0)=(X1)*216+(X0) X*Y=(Y1)*216+(Y0)*(X1)*216+(X0) =(Y1)*(X

4、1)*232+(Y1)*(X0)*216+ (Y0)*(X1)*216+(Y0)*(X0) 例例5.2 两个32位数分别为X和Y, 乘积放在RESULT开始的四个字中, 低位字节放在低地址中。 程序如下:; NAME EX052DATA SEGMENT X DD 12345678H; 32位被乘数 Y DD 567890ABH; 32位乘数 RESULT DW 4 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV SI, OFFSET RESULT MOV AX, W

5、ORD PTR X MOV CX, WORD PTR Y MUL CX MOV SI, AX MOV SI+2, DX MOV AX, WORD PTR X MOV CX, WORD PTR Y+2 MUL CX ADD SI+2, AX ADC WORD PTRSI+4, DX MOV AX, WORD PTR X+2 MOV CX, WORD PTR Y MUL CX ADD SI+2, AX ADC SI+4, DX ADC WORD PTR SI+6, 0 MOV AX, WORD PTR X+2 MOV CX, WORD PTR Y+2 MUL CX ADD SI+4, AX ADC

6、 SI+6, DX MOV AH, 4CH INT 21H CODE ENDS END START以上程序很容易看懂, 在进行加法时, 216和232只要分别位移一个字或两个字再进行加法即可。 相对SI, SI+2为高位字; 而SI+4和SI+6又是SI字的更高一位字或两位字。 当ADC指令加一个立即数0时, 由于没声明是字节0还是字0, 所以WORD PTR不能省去, 否则就会在汇编时出错。程序分析:程序分析:5.3 多字节除法多字节除法 设有一个64位数除16位数,则商可能仍是64位, 而余数为16位。 若用一般的除法,则很难进行处理。 如果用被除数连续减去除数得到商,很可能要减亿万次,计

7、算机将用很长时间才能完成这么大的运算量。 如果在进行最高位除法时,高16位被除数为0, 然后将被除数最高16位送AX,除数放在CX中, 这样, 除法肯定不会产生溢出。第一次除法后的余数放在DX中, 作为第二次除法的高16位,将下一个被除数16位送AX, 再进行除法, 用这种方法,可以顺利地完成整个除法运算。例例5.3 设被除数为8个字节的X, 而除数为两个字节的Y, 商放在RESULT中, 仍采取高字节放在高地址, 余数放在EXTRA中。 程序如下:;NAME EX053DATA SEGMENT X DQ 1234567890ABCDEFH Y DW 1234HRESULT DW 4 DUP(

8、0) EXTRA DW 0 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA START: MOV AX, DATA MOV DS, AX MOV CX, Y MOV DX, 0 MOV AX, WORD PTR X+6 DIV CX MOV WORD PTR RESULT+6, AX MOV AX, WORD PTR X+4 DIV CX MOV WORD PTR RESULT+4, AX MOV AX, WORD PTR X+2 DIV CX MOV WORD PTR RESULT+2, AX MOV AX, WORD PTR X DIV CX

9、MOV WORD PTR RESULT, AX MOV EXTRA, DX MOV AH, 4CH INT 21H CODE ENDS END START 5.4 BCD数的算术运算数的算术运算 8088指令系统提供了若干条BCD调整指令, 但这些指令只能对用BCD码表示的一位或两位十进制数操作,范围狭小。对多字节的BCD码进行运算就要用大量的调整指令,尤其是乘法, 所费的时间是二进制运算的数倍。一般情况下对BCD数的运算,先转换为二进制数,然后进行相应的二进制运算,若运算结果要求以十进制BCD输出或BCD的ASCII输出,可以再次运用代码转换的方法来实现。 对于多字节压缩型的十进制加法和减法

10、, 已在例5.1和5.2中介绍过。 下面对非压缩型的十进制数运算再举几个例子。 1. 多字节非压缩型十进制数加法 例5.7设在存储单元A、 B分别有10个非压缩BCD数, 相加后的结果放在C单元开始的11个单元中, 低位字节从低地址存放。 程序如下: ;NAME EX056 DATA SEGMENT A DB 1, 2, 3, 4, 5, 6, 7, 9, 8, 4 B DB 8, 9, 7, 6, 5, 4, 8, 7, 6, 5 C DB 11 DUP(0) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV

11、 AX, DATA MOV DS, AX MOV ES, AX CLD CLC MOV SI, OFFSET A MOV BX, OFFSET B MOV DI, OFFSET C MOV CX, 10 AGAIN: LODSB ADC AL, BX AAA ; STOSB INC BX LOOP AGAIN ADC BYTE PTR DI, 0 MOV AH, 4CH INT 21H CODE ENDS END START 对于非压缩型多字节的BCD数减法, 也可对上述程序稍加改动来实现。 若被减数为A, 减数为B, 结果送C, 则将上述程序中的ADC指令改为SBB指令, AAA指令改为AA

12、S指令, 在A大于B的情况下, 还可将循环后的一条指令ADC删去。2. 非压缩型十进制数相乘非压缩型十进制数相乘 例例5.7 设被乘数从A单元开始存放, 乘数为一位非压缩型BCD数, 存于B单元, 相乘后的十进制结果从C单元开始存放, 仍为非压缩型的BCD数。 分析: 乘法十进制调整指令AAM完成如下操作: 首先将AX中的乘积分解为两位BCD数, 低位存在AL中, 高位送AH。 在进行高一位的乘法时, 应将调整后的低位BCD数与上一次乘法中的高位BCD相加。 由于相加后, 可能有进位或需要进行加6修正, 这时应加一条AAA调整指令。 这两次BCD调整, 都可能影响AH, 所以AH应在两次BCD

13、的调整后再保存。 程序如下:; NAME EX057 DATA SEGMENT A DB 2, 6, 3, 7, 5 N EQU $-A B DB 6 C DB N+1 DUP(?) DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS, AX MOV ES, AX CLD LEA SI, A LEA DI, C MOV CX, N MOV BYTE PTR DI, 0 AGAIN: LODSB MUL B AAM ADD AL, DI ; 加低位乘积的高位 AAA STOSB ;

14、执行后DI将自增 MOV DI, AH LOOP AGAIN MOV AH, 4CH INT 21H CODE ENDS END START 它与多字节BCD加法相类似, 将最低位乘积置成0, 就如同BCD加法中的CLC指令的作用, 即把最初低位乘积的高位置成0。 STOSB指令将乘积的低位BCD存于本位的乘积单元, 而DI指向下一个单元, 用来存放AH中的乘积的高位BCD数。 3. 两个多位十进制数相乘两个多位十进制数相乘例5.8 有两个BCD数为345*789,设乘积为Z, 则有: Z=345*7*102+345*8*10+345*9Z=A*100+B*10+C其中A、 B、 C均可由多位

15、BCD与一位BCD相乘来实现, 相加则可通过B左移一个字节, A左移两个字节相加实现。 程序如下: ;NAME EX058DATA SEGMENT A DB 5, 4, 3 ; 被乘数为345B DB 9, 8, 7 ; 乘数为789C DB 6 DUP(0) ; 部分积中间结果D DB 6 DUP(0) ; 乘积的结果单元N1 EQU 3 ; 按位乘计数器N2 EQU 6 ; 按位加计数器COUNT DB 3 DATA ENDS CODE SEGMENT ASSUME CS:CODE, DS:DATA, ES:DATA START: MOV AX, DATA MOV DS, AX MOV E

16、S, AX MOV SI, OFFSET A MOV BX, OFFSET B MOV DI, OFFSET C MOV CX, N1 AGAIN: PUSH BX PUSH CX PUSH DI CLD MOV DI, OFFSET C MOV CX, N2 CLEAR: MOV BYTE PTR DI, 0 ; 清中间区 INC DI LOOP CLEAR POP DI ; 指向本次部分积低位 POP CX MOV SI, OFFSET A PUSH CX PUSH DI CALL SM ; 进行十进制乘法 MOV SI, OFFSET C MOV DI, OFFSET D MOV CX,

17、 N2 CLC CALL SA ; 加本次部分积 POP CX POP DI POP BX INC DI ; 指向乘积的高一位 INC BX ; 指向乘数的高一位 DEC COUNT ; 乘数位数计数器 JNZ AGAIN ; 未乘完继续 MOV AH, 4CH INT 21H SM PROC LOP: LODSB ; 取被乘数至AL MUL BYTE PTRBX AAM ; 十进制乘法调整 ADD AL, DI ; 计算部分积U AAA STOSB MOV DI, AH LOOP LOP RET SM ENDP SA PROC LP: LODSB ; 取被加数 MOV AH, 0 ADC A

18、L, DI ; 加部分积 AAA STOSB ; 存新的部分积 ADD DI, AH LOOP LP RET SA ENDP CODE ENDS END START 说明: 本程序的算法是: D单元是总的部分积, 计算结束时为最后的结果乘积。 C单元是中间的部分积, 由于乘数位不同, 中间部分积最低位是不同的, 故每次存中间结果前, 应该清除C存储区的内容。 SM子程序完成多位被乘数与一位字节的乘数十进制乘法, 部分积存于C存储区, 然后调用SA子程序, 将这次部分积加到总部分积中去。4. 多字节非压缩型多字节非压缩型BCD除法除法例5.9 为实现多位非压缩型BCD被一位BCD除法运算,首先运用除法十进制调整指令的功能, 将AH和A

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论