东北大学汇编语言第10章 算术运算与代码转换

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
wk.baidu.com
MUL8 PROC XOR XOR MUL80:OR JNZ RET MUL81:SHR JNC ADD MUL82:SHL JMP MUL8 ENDP BL,1 MUL82 DX,AX AX,1 MUL80 AH,AH DX,DX BL,BL MUL81 子程序说明文件如下: (1)子程序名:MUL8 (2)子程序功能:两个8位数相乘 (3)入口条件:被乘数在AL中, 乘数在BL中 (4)出口条件:乘积在DX中 (5)受影响的寄存器:F,AX,BL,DX
子程序清单如下: MSHL PROC PUSH PUSH CLC MSHL1: RCL DEC DEC JNZ BYTE PTR [SI],1 SI CH MSHL1 SI CX MCMP POP POP RET ENDP CX SI
主程序清单如下: DSEG DIVND DIVOR DIVM DIVN QUON QUO REM DSEG SSEG STK SSEG CSEG SEGMENT DB DB DW DW DW DB DB ENDS SEGMENT STACK DB ENDS SEGMENT ASSUME CS:CSEG,DS:DSEG ASSUME ES:DSEG,SS:SSEG START: MOV MOV AX,DSEG DS,AX 20 DUP(0) 5FH,0D4H,0E4H,0DCH,68H,1DH 85H,27H,4AH 6 3 0 3 DUP(0) 3 DUP(0) MOV MOV MOV MOV LEA MOV ADD DEC LEA MOV ADD DEC MOV SUB MOV ADD ADD ES,AX AX,SSEG SS,AX SP,SIZE STK SI,DIVND BX,SI BX,DIVM BX DI,DIVOR DX,DI DX,DIVN DX CX,DIVM CX,DIVN QUON,CX CX,CX CX,CX
10.2.4 多字节整数除法运算
用程序实现除法常常采用模拟人工笔算的方法,下面举例说明除法过程,为 了使问题简单,叙述方便,假设被除数为8位二进制数,除数为4位二进制数,如 下所示: 01000011÷0110=1011 余0001 0110 01000011 0110
10.2.4 多字节整数除法运算
用程序实现除法常常采用模拟人工笔算的方法,下面举例说明除法过程,为 了使问题简单,叙述方便,假设被除数为8位二进制数,除数为4位二进制数,如 下所示: 01000011÷0110=1011 余0001 0110 1 01 ………商 1 01000011 0110 0001001 0110 00111 0110 0001………余数 由上述过程可以看出人工 笔算除法的步骤: 笔算除法的步骤: (1)判断被除数(以后 )判断被除数( 为余数)是否大于除数. 为余数)是否大于除数.若大 于除数,则从被除数( 于除数,则从被除数(后为余 中减去除数,该位商上1; 数)中减去除数,该位商上 ; 否则不减除数,商上0; 否则不减除数,商上 ; (2)落下被除数中的下 ) 一位,重复第一步, 一位,重复第一步,直至得到 商的最低位. 商的最低位.
用计算机模拟人工运算,结合计算机提供的指令功能,其过程如下所示: 操 比较 作 被除数(余数) 01000011 0110…………无溢出 被除数左移一位 比较,够减,相减 0 1000011 0110…………商上1 00100110 余数左移一位 比较,不够减 余数左移一位 比较,够减,相减 0 01001100 0110…………商上0 0 10011000 0110…………商上1 00111000 余数左移一位 比较,够减,相减 0 01110000 0110…………商上1 商 1011
子程序清单如下: MSUB PROC PUSH PUSH PUSH CLC MSUB1: MOV SBB INC AL,[DI] [SI],AL SI MCMP SI AX DI INC DEC JNZ POP POP POP RET ENDP DI AH MSUB1 DI AX SI
(1)多字节数据左移一位子程序MSHL 子程序说明文件如下: 1)子程序名:MSHL; 2)子程序功能:多字节数据左移一位; 3)入口条件:数据低字节地址在SI中,数据长度在CH中; 4)出口条件:移后数据低字节地址在SI中;CF为移位前数据最高位状态; 5)受影响的寄存器:F.
程序清单如下: DSEG DATA1 DATA2 LEGH SUM DSEG CSEG SEGMENT DB DB DW DB ENDS SEGMENT ASSUME START: MOV MOV LEA LEA LEA CS:CSEG,DS:DSEG AX,DSEG DS,AX SI,DATA1 BX,DATA2 DI,SUM CSEG ADC BYTE PTR[DI],0 85H,27H,4AH;(4A2785H) 93H,87H,65H;(658793H) 3 3 DUP(0) MOV CLC AGAIN: MOV ADC MOV AL,[SI] AL,[BX] [DI],AL SI BX DI AGAIN AH,4CH 21H CX,LEGH
用计算机模拟人工运算,结合计算机提供的指令功能,其过程如下所示: 操 比较 作 被除数(余数) 01000011 0110…………无溢出 被除数左移一位 比较,够减,相减 0 1000011 0110…………商上1 00100110 余数左移一位 比较,不够减 余数左移一位 比较,够减,相减 0 01001100 0110…………商上0 0 10011000 0110…………商上1 商 101
子程序清单如下: MCMP PROC PUSH PUSH PUSH MCMP1: MOV CMP JNZ DEC SI AX DI AL,[SI] AL,[DI] MCMPR SI MCMP DEC DEC JNZ MCMPR: POP POP POP RET ENDP DI AH MCMP1 DI AX SI
(1)多字节数据相减子程序MSUB 子程序说明文件如下: 1)子程序名:MSUB; 2)子程序功能:多字节数据相减; 3)入口条件:被减数和减数的低字节地址分别在SI和DI中,字节数在AH中; 4)出口条件:结果值在被减数单元(SI为地址指示器); 被减数大于或等于减数时,CF=0,否则CF=1; 5)受影响的寄存器:F.
二进制数相乘,部分积的计算实际上是用"1"乘被乘数或者用"0"乘被乘数;所以中 间结果的计算是根据乘数的每一位状态是"1"还是"0"而决定中间结果加被乘数,还是不 加.
根据上述运算过程,可以制定乘法算法如下: (1)取乘数和被乘数; (2)中间结果单元清零; (3)若乘数为零则结束乘法; (4)乘数逻辑右移一位,最低位移入进位标志CF中,如果CF为零则转第 (6)步; (5)中间结果加上被乘数; (6)被乘数左移一位; (7)重复第3,4,5,6步,直到乘完所有位. 下面给出一个采用如上所述的算法实现的两个单字节数据相乘的乘法子程序.
除法的具体算法如下: (1)取被除数和除数; (2)设置运算次数(获得商的位数); (3)被除数和商左移一位; (4)比较; (5)不够减,商上0,转(7); (6)够减则相减,商上1; (7)运算次数减1,不为0,转(3); (8)运算次数为0,结束除法运算.
例10.4 设被除数为M个字节,存放在DIVND开始的连续单元; 除数为N个字节,存放在DIVOR开始的连续单元;其中M>N,两数 均为无符号整数.求其商和余数,并分别存入QUO和REM开始的连 续单元. 如果被除数M个字节中的前N个字节(高位部分)小于除数, 则商为M-N个字节,余数为N个字节. 我们可以按照前面介绍的多字节整数除法的算法编制多字节整 数除法,此时,要解决多字节数据的比较,相减与移位,这些操作 都可以用子程序来实现.各子程序说明文件及其清单如下:
要编制两个多字节整数相乘的程序,只要将上述例子中的移位改成多字节数据的移位, 相加改成多字节数据的相加即可,这些操作都可以编制为子程序,在需要时对其调用. 我们上述计算的是两个无符号数据的乘法,若数据为带符号数,则如何相乘呢? 若数据为带符号数,则在相乘前,要确定乘积的符号,并保存起来,然后将两数取绝 对值,进行乘法,得两数绝对值的乘积,最后根据乘积的符号,再对绝对值的乘积进行符 号处理,若乘积符号为正,则绝对值的乘积即为最终结果,若乘积符号为负,则将绝对值 的乘积取补.解题步骤如下: (1)取两数的最高字节进行异或,保存标志寄存器; (2)若乘数为正,则转(4); (3)若乘数为负,则将乘数取补; (4)若被乘数为正,则转(6); (5)若被乘数为负,则将被乘数取补; (6)两个数的绝对值相乘,得乘积的绝对值; (7)取出标志寄存器的原有内容,判断符号标志位SF; (8)若SF为0,则乘积应为正,转(10) (9)若SF为1,则乘积应为负,对乘积的绝对值取补; (10)结束.
4
INC INC INC LOOP MOV INT ENDS END
START
10.2 多字节整数乘除运算
10.2.1 10.2.2 10.2.3 10.2.4 一般整数乘法运算 多字节整数乘法运算 一般整数除法运算 多字节整数除法运算
10.2.2 多字节整数乘法运算
手算乘法过程: 0110 × 1011 0110 0110 0000 +0110 1000010 模拟人工乘法过程: 0110 × 1011 0000 + 0110 0110 + 0110 10010 + 0000 010010 + 0110 1000010 被乘数 乘数 中间结果(开始为零) 部分积(0110×1) 中间结果 部分积(0110×1) 中间结果 部分积(0110×0) 中间结果 部分积(0110×1) 结果
(1)多字节数据比较子程序MCMP 子程序说明文件如下: 1)子程序名:MCMP; 2)子程序功能:多字节数据比较(无符号数); 3)入口条件:两数最高字节地址分别在SI和DI中,数据长度在AH中; 4)出口条件:进位标志CF=1,被减数小于减数 进位标志CF=0,被减数大于或等于减数; 5)受影响的寄存器:F.
第十章 算术运算与代码转换
10.1 多字节加减运算 10.2 多字节整数乘除运算 10.3 BCD码运算 10.5 浮点数的加减法 10.7 十进制数的ASCII码串转换为二进制定点数 10.8 二进制定点数转换为十进制数的ASCII码串
10.1 多字节加减运算
例10.1 内存DATA1和DATA2分别存放一个多字节数据,数据长度在LEGH 单元存放.编制程序计算两个数据之和并存入SUM开始的单元.
用计算机模拟人工运算,结合计算机提供的指令功能,其过程如下所示: 操 比较 作 被除数(余数) 01000011 0110…………无溢出 被除数左移一位 比较,够减,相减 0 1000011 0110…………商上1 00100110 余数左移一位 比较,不够减 余数左移一位 比较,够减,相减 0 01001100 0110…………商上0 0 10011000 0110…………商上1 00111000 余数左移一位 比较,够减,相减 0 01110000 0110…………商上1 0001…………余数 商 1011 余数 0001
用计算机模拟人工运算,结合计算机提供的指令功能,其过程如下所示: 操 比较 作 被除数(余数) 01000011 0110…………无溢出 被除数左移一位 比较,够减,相减 0 1000011 0110…………商上1 1
用计算机模拟人工运算,结合计算机提供的指令功能,其过程如下所示: 操 比较 作 被除数(余数) 01000011 0110…………无溢出 被除数左移一位 比较,够减,相减 0 1000011 0110…………商上1 00100110 余数左移一位 比较,不够减 0 01001100 0110…………商上0 商 10
相关文档
最新文档