汇编语言程序设计-课件 -第六章(1)算术运算程序设计_第1页
汇编语言程序设计-课件 -第六章(1)算术运算程序设计_第2页
汇编语言程序设计-课件 -第六章(1)算术运算程序设计_第3页
汇编语言程序设计-课件 -第六章(1)算术运算程序设计_第4页
汇编语言程序设计-课件 -第六章(1)算术运算程序设计_第5页
已阅读5页,还剩40页未读 继续免费阅读

下载本文档

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

文档简介

第6章应用程序设计6.1算术运算程序设计1.定点数运算的概念数的表示法:纯小数、纯整数补码形式单字节和多字节有符号数和无符号数

2.定点数的加法运算十进制数:压缩和非压缩调整例1编制多字节压缩型十进制数加法运算程序要求:如有两个多字节的压缩型十进制数存于A、B单元开始的数据区中,试将其相加并将十进制数的结果存于C单元起的数据区中。设压缩十进数字节长度N为10。源程序: DATA SEGMENT A DB22H,23H,34H,…

B DB32H,43H,54H,…

C DB11DUP(?) N EQU10 DATA ENDS CODE SEGMENT ASSUMECS:CODE,DS:DATA START: MOV AX,DATA MOVDS,AX MOVSI,OFFSETA

MOVDI,OFFSETB MOVBX,OFFSETC MOVCX,N CLCNEXT: MOV AL,[SI]

ADC AL,[DI]

DAA

MOV [BX],AL

INC SI

INC DI INC BX LOOPNEXT MOV AL,0

ADC AL,0 INC BX MOV [BX],AL

MOV AH,4CH INT 21H CODE ENDS END START例2编制多字节非压缩型十进制数加法运算程序源程序:要求:在存储单元A、B分别有10个非压缩十进制数,相加后结果仍放在B单元起的11个单元中。DATA SEGMENTA DB06,08,09,07,08.01,02,03,05,06

B DB04,03,05,01.06.08.09,03,02,06N EQU10DATA ENDSCODE SEGMENT ASSUMECS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV ES,AX MOVSI,OFFSETA

MOVDI,OFFSETB MOVCX,10

CLC CLDNEXT:LODSB ADC AL,[DI]

AAA

STOSB

LOOPNEXT

JNC NCF

MOV BYTEPTR[DI],1NCF:INC DI MOV AH,2

MOV CX,11LP: DEC DI MOV DL,[DI] OR DL,30H INT 21H LOOP LP MOV AH,4CH INT 21H CODE ENDS END START3.十进制数减法运算需要考虑的问题有:两个数的长度是否一致、溢出问题例3:编制多字节二进制减法运算程序

要求:编写一个多字节二进制减法子程序SUBBER,设被减数和减数及运算结果均在调用程序的数据区中,低字节在前,高字节在后。本例不要求对运算结果产生溢出或借位进行处理。

源程序:SUBBER PROC FAR AND AL,AL LP: MOV AL,[SI]

SBB AL,[DI]

MOV [BX],AL

INC SI

INC DI INC BX LOOP LP

RETSUBBER ENDP END调用程序段为MOVSI,OFFSETAMOVDI,OFFSETBMOVBX,OFFSETCMOVCX,NCALLSUBBER例2:编制多字节十进制数减法运算程序

要求:在A、B开始的单元中,各有一组压缩型十进制数。今相减后结果存入C开始的单元中。设字节长为10H。源程序片段如下:

LEA SI,A

LEA DI,B LEABX,C

MOV CX,16

CLCLOP: MOV AL,[SI]

SBBAL,[DI]

DAS

MOV [BX],AL

INC SI

INC DI INC BX LOOPLOP 4.定点数乘法运算针对多字节例1:编制16位有符号数乘法程序要求:将字单元A与字单元B所表示的有符号数相乘,其乘积存入C地址开始的字单元中。源程序:DATA SEGMENTA DW 7890B DW 120AHC DW2DUP(?)DATA ENDSCODE SEGMENT ASSUME DS:DATA,CS:CODEST: MOV AX,DATA MOV DS,AX

MOV AX,A IMUL B MOV C,AX MOV C+2,DX MOV AH,4CH INT 21HCODE ENDS END ST非压缩十进制数可以实现乘法运算。它是先进行二进制数乘法运算,然后再进行乘积的十进制调整。例:编制一个非压缩十进制数相乘程序。要求:在A单元起开始有多位非压缩十进制数与B单元的一位非压缩十进制数相乘,结果存于C单元起开始的地址中。A单元开始非压缩十进制数的位数用符号常量N表示。源程序:DATA SEGMENTA DB2,6,3,7N EQU$-AB DB6

C DBN+1DUP(?)DATA ENDSCODE SEGMENTASSUMECS:CODE,DS:DATA,ES:DATAST: MOV AX,DATA MOV DS,AX MOV ES,AX CLD MOV SI,OFFSETA

MOV DI,OFFSETC

MOV CX,N MOV BYTEPTR[DI],0 LOP:LODSB

MUL B

AAM

ADD AL,[DI]

AAA

STOSB

MOV [DI],AH

LOOP LOP MOV AH,4CH INT 21H CODE ENDS END ST实际应用中,经常使用的是多位的十进制数相乘。

例1:编制两个多位的十进制数相乘程序。要求:在A处单元开始有多字节的非压缩BCD型被乘数,在B处单元开始有非压缩型多字节的BCD乘数,求其积存在以C处开始的的单元中。一般存放规律是高位数在高地址端。源程序:DATA SEGMENTA DB 2,6,3,7,5 ;被乘数57362B DB 6,5 ;乘数56C DB 7DUP(0);低位部分积存放单元

D DB 7DUP(0);高位部分积存放单元

N1 EQU 5 ;按位乘计数值

N2 EQU 7 ;按位加计数值DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATA,ES:DATAST: MOV AX,DATA MOV DS,AX MOV ES,AX MOV SI,OFFSETA ;置地址指针

MOV DI,OFFSETC ;置结果地址指针 MOV CX,N1 MOV BL,B ;取乘数低位

CLD CALL SM

MOV SI,OFFSETA

MOV DI,OFFSETD+1

MOV CX,N1 MOV BL,B+1

CLD CALL SM

MOV SI,OFFSETC

MOV DI,OFFSETD

MOV CX,N2 CLD CLC CALL SA MOV AH,4CH INT 21H;非压缩十进制数乘法子程序;入口参数:SI为被乘数地址指针,DI为部分积地址指针;CX为按位乘计数器,BL为乘数寄存器;出口参数:在DI指向的存储区中有运算结果SM PROC MOV BYTEPTR[DI],0LOP:LODSB

MUL

BL

AAM

ADD

AL,[DI]

AAA

STOSB

MOV

[DI],AH

LOOP

LOP RETSM ENDP

;非压缩十进制数加法子程序 ;入口参数:SI为非压缩十进制加数地址指针 ;DI为非压缩十进制被加数地址指针 ;CX为加法运算位数 ;出口参数:加法结果在DI指向的存储区中 SA PROC LP: LODSB ADC AL,[DI] AAA STOSB

LOOP LP RET SA ENDP CODEENDS END ST对于压缩BCD码如何实现乘法运算?例下:编制两个压缩BCD数相乘程序要求:A、B单元各有两位压缩型BCD码,求其乘积并存于C起的单元中。源程序:

DATA SEGMENTA DB 35H

B DB 26H

C DB 2DUP(?)DATA ENDS

CODE SEGMENT ASSUME CS:CODE,DS:DATAST: MOV AX,DATA MOV DS,AX

MOV BL,A

MOV CL,B

MOV DX,0 AGAIN: MOV AL,DL

ADD AL,CL DAA

MOV DL,AL MOVAL,DH

ADC AL,0 DAA MOVDH,AL

MOVAL,BL SUB AL,1 DAS MOV BL,AL OR AL,AL JNZ AGAIN MOV BX,OFFSETC

MOV [BX],DX MOV AH,4CH INT 2lHCODE ENDS END ST5.定点数除法运算分为有符号数和无符号数存在溢出的情况二进制和十进制数例、试编制压缩型BCD数除法程序要求:把在地址A起单元开始的8位压缩BCD被除数与地址B起单元开始的4位压缩BCD除数相除,结果的BCD商值存入以C地址开始起的存储单元中,BCD余数存入以D地址起开始的存储单元中。源程序:DATA SEGMENTA DW 1246H,2187H;被除数,高位数在前

B DW 2536H ;除数

C DW 0 ;商

D DB 0 ;余数DATA ENDSSTACK SEGMENTPARASTACK‘STACK’ DB 200DUP(?)STACK ENDSCSEG SEGMENTPARAPUBLIC‘CODE’EXTRN BCDDlVBCDD1V:FAR ASSUMECS:CSEG,DS:DATA,SS:STACKST: MOV AX,DATA MOVDS,AX MOVAX,STACK MOVSS,AX MOVDX,A ;取被除数

MOVAX,A+2 MOVBX,B ;取除数

CALL BCDDIV;调BCD除法子程序

MOV C,AX ;存结果

MOV D,DX MOV AH,4CH INT 21H CSEGENDS END ST NAME BCDDIV

;子程序名:BCDDIV

;入口参数:DX,AX=8位压缩型BCD被除数(DX为高位数) ;BX=4位压缩型BCD除数(BH为高位数) ;出口参数:AX=4位压缩型BCD商;DX=4位压缩型BCD余数

PUBLICBCDDIV EXTRNBCDTOB:FAR,BTOBCD:FARCSEG SEGMENTPARAPUBLIC'CODE' ASSUMECS:CSEGBCDDIV PROC FAR PUSH BX ;保护寄存器

PUSH CX PUSH SI PUSH AX

MOVAX,BX ;取除数

CALLBCDTOB ;转为二进制数

MOVBX,AX ;存回BXMOVAX,DX ;取高位被除数

CALLBCDTOB ;转为二进制数

MOVCX,10000 ;高位乘10000MULCX ;结果在DX:AX中

MOVSI,AX ;暂存AXPOPAX ;取低位被除数

CALLBCDTOB ;转为二进数

ADDAX,SI ;低位二进制数相加

ADCDX,0 ;高位数加进位

DIVBX;二进制除法,高位存AX,余数存DXMOVCX,AX ;暂存商

MOVAX,DX ;置余数到AX CALLBTOBCD ;转二进制余数为BCD数

MOVDX,AX ;存BCD余数

MOVAX,CX ;置商到AXCALLBTOBCD ;转商为BCD数,结果在AX中

POPSI ;恢复寄存器

POPCX

POPBXRET BCDDIV ENDP CSEG ENDS

END NAME BCDTOB

;子程序名:BCDTOB

;入口参数:AX为压缩型BCD数 ;出口参数:AX为16位二进制数

PUBLICBCDTOB CSEGSEGMENTPARAPUBLIC'CODE' ASSUMECS:CSEG BCDTOB PROC FAR PUSH CX PUSH DI PUSH SI MOV SI,AX ;取BCD数

SUB AX,AX ;AX清0CALLSHAD ;完成高位数乘10运算并加低位数

CALLSHAD ;然后转为二进制数

CALLSHADCALLSHADPOP SIPOP DIPOP CXRET BCDTOB ENDP;子程序名:SHAD

;功能:完成高位数乘10加低位数,并变为二进制数;入口参数:SI为4位BCD数,AX为高位数的初值;出口参数:AX为每位BCD数转换后的二进制数

SHAD PROC NEAR MOVDI,0 MOVCX,4LP: SHLSI,1;移BCD高位到DI中,作转换准备

RCL DI,1 LOOPLP MOV CX,10 MUL CX ;AX×10→AX ADD AX,DI ;加低位BCD数

RET SHAD ENDP SCEG ENDS END

NAMEBTOBCD

;子程序名:BTOBCD

;功能:二进制数转为BCD数子程序;入口参数:AX为16位二进制数

;出口参数:AX为4位BCD数,当CF=1,因数大不转换,AX中仍为未转换的二进制数

PUBLICBTOBCD CSEG SEGMENTPARAPUBLIC‘CODE’ ASSUMECS:CSEG

BTOBCD PROC FAR CMP AX,9999 ;判断数大于9999吗?

JBE CONTN STC ;大于,置CF=1 JMPEXITCONTN:PUSHCX PUSHDX SUB DX,DX MOV CX,1000 ;二进制数除1000 DIV CX

XCHGAX,DX ;商、余交换

MOV CL,4 SHL DX,CL ;千位数左移4位

MOV CL,100 ;二进制余数除100 DIV CL

ADD DL,AL ;加入百位数

MOV CL,4 SHL DX,CL ;千、百位左移4位 XCHGAL,AH ;商、余交换

SUB AH,AH ;清AHMOVCL,10 ;二进制余数除10DIV CL ;AX/CL→AL(商),AH(余)

ADD DL,AL ;加入十位数

MOV CL,4SHL DX,CL ;千、百、十位左移4位

ADD DL,AH ;加入个位数

MOV AX,DX ;转换后的BCD数存AX作出口参数

POP DXPOP CXEXIT: RET BTOBCD ENDP CSEG ENDS END例:试编制多字节非压缩型BCD数除法程序源程序:DATA SEGMENTA DB8,8,7,5,4 ;十进制被除数88754B DB6 ;十进制除数6C DB5DUP(0);商值单元

N EQU5 ;被除数位数DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,ES:DATASTART: MOV AX,DATA MOV DS,AX MOV ES,AX

CLD LEA SI,A ;置被除数地址指针

LEA DI,C ;商值地址指针

MOV CX,N ;单位除法次数计数器

MOV AH,0 ;清AHLP1: LODSB ;取高位被除数→AL AAD ;对AX作十进制调整

DIV B ;AX/B→AL(商),AH(余)

STOSB ;存商高位

LOOPLP1 ;对被除数各位除操作

MOVCX,N ;显示除运算结果

LEA DI,CLP2: MOV DL,[DI]

MOV AH,2 INT 21H DEC DI LOOPLP2 MOV AH,4CH INT 21H CODEENDS END START例、试编制多字节压缩型BCD数的除法程序要求:在A、B地址起开始的存储单元中,各有一组压缩型十进制数,要求实现A/B,结果余数存A起地址开始的存储单元中,商值存C地址起开始的存储单元中。源程序:DA

温馨提示

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

评论

0/150

提交评论