




已阅读5页,还剩32页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2020/5/22,第10章数据运算程序设计,1,8086/8088和ARM核汇编语言程序设计,第10章数据运算程序设计,2020/5/22,第10章数据运算程序设计,2,10.1多精度的加减运算,10.2乘除运算,第10章数据运算程序设计,2020/5/22,第10章数据运算程序设计,3,本节主要介绍多字节无符号二进制数的加减法运算程序设计,特别要注意运算中加法进位和减法借位问题。,10.1.1二进制加减运算,10.1多精度的加减运算,2020/5/22,第10章数据运算程序设计,4,加法运算,10.1多精度的加减运算,10.1.1二进制加减运算,例10.1编制完成两个无符号的四字节二进制数的加法运算。,如8090H+8182H8090H分解为字节加80H90H+8182H+81H82H10212H+1H(进1)12H(进1)02H,把以上的字节看成为字,四字节可分为两个字的加法。,由此可推出两个M个字节数的加等于作M次字节加或M/2次字加,2020/5/22,第10章数据运算程序设计,5,10.1多精度的加减运算,10.1.1二进制加减运算,分解为寄存器加alal+bxbx+cy(进cf)al(进cf)al,2020/5/22,第10章数据运算程序设计,6,汇编程序,10.1多精度的加减运算,10.1.1二进制加减运算,nameexp10-1.asmdatasegmentaddr1db6ch,8ah,3bh,49haddr2db3eh,5bh,6fh,7dhresultdb0,0,0,0lenequ4dataends,2020/5/22,第10章数据运算程序设计,7,codesegmentassumecs:code,ds:datastart:movax,datamovds,axmovsi,offsetaddr1;si取被加数addr1地址偏移量movbx,offsetaddr2;bx取加数addr2地址偏移量movdi,offsetresult;di取和result地址偏移量movcl,len;cl字节数clc;清进位标志skip:moval,siadcal,bx;完成字节加法movdi,al;保存求和结果incsi;修改地址incbxincdideccl;字节计数jnzskipmovax,4c00h;返回DOSint21hcodeendsendstart,10.1多精度的加减运算,10.1.1二进制加减运算,2020/5/22,第10章数据运算程序设计,8,10.1多精度的加减运算,10.1.1二进制加减运算,减法运算,分解为寄存器减alal-bxbx-cf(借cf)al(借cf)al,2020/5/22,第10章数据运算程序设计,9,nameexp10-2.asmdatasegmentaddr1dw8a6ch,493bh;定义4字节被减数addr2dw5b3eh,7d6fh;定义4字节减数resultdw2dup(?);定义存放差的单元lendw0002h;定义循环计数值为2个字dataends,10.1多精度的加减运算,10.1.1二进制加减运算,2020/5/22,第10章数据运算程序设计,10,10.1多精度的加减运算,10.1.1二进制加减运算,codesegmentassumecs:code,ds:datastart:movax,datamovds,axmovsi,offsetaddr1;si取被减数addr1地址偏移量movbx,offsetaddr2;bx取减数addr2地址偏移量movdi,offsetresult;di取差result地址偏移量movcx,len;cx字数clc;清进位标志skip:movax,sisbbax,bx;完成字减法movdi,ax;保存求差的结果,2020/5/22,第10章数据运算程序设计,11,incsi;修改被减数地址incsiincbx;修改减数地址incbxincdi;修改结果差地址incdiloopskipmovax,4c00h;返回DOSint21hcodeendsendstart,10.1多精度的加减运算,10.1.1二进制加减运算,addsi,2,2020/5/22,第10章数据运算程序设计,12,压缩型BCD码运算即是每一个字节表示两位BCD码十进制数。,10.1多精度的加减运算,10.1.2压缩型BCD码加减运算,如:1234十进制数表示压缩型BCD码为:12H34H即0001001000110100B,加法可利用指令add、adc与daa调整指令来配合减法可利用指令sub、sbb与das调整指令来编程,2020/5/22,第10章数据运算程序设计,13,例10.3编写一四字节压缩型BCD码的减法运算。要求完成:result9657834268351490,10.1多精度的加减运算,10.1.2压缩型BCD码加减运算,nameexp10-3.asmdatasegmentbcd1db42h,83h,57h,96hbcd2db90h,14h,35h,68hresultdb4dup(?)dataends,2020/5/22,第10章数据运算程序设计,14,codesegmentassumecs:code,ds:datastart:movax,datamovds,axmovcx,4movsi,0clc;清进位标志skip:moval,bcd1si;取被减数sbbal,bcd2si;对应位相减das;十进制减法调整movresultsi,al;保存求差的结果incsi;修改地址偏移量loopskip;循环运算4个字节movax,4c00h;返回DOSint21hcodeendsendstart,10.1多精度的加减运算,10.1.2压缩型BCD码加减运算,2020/5/22,第10章数据运算程序设计,15,10.1多精度的加减运算,10.1.2非压缩型BCD码加减运算,非压缩型BCD码运算即是每一个字节表示一位BCD码十进制数。,如:1234十进制数表示非压缩型BCD码为:01H02H03H04H即00000001000000100000001100000100B,加法可利用指令add、adc与aaa调整指令来配合减法可利用指令sub、sbb与aas调整指令来编程,2020/5/22,第10章数据运算程序设计,16,10.1多精度的加减运算,10.1.2压缩型BCD码加减运算,例10.4编程计算非压缩型BCD码(ASCII码)的加法运算。要求完成:result832651并将结果在屏幕上输出显示。,nameexp10-4.asmdatasegmentasc1db2,3,8;定义被加数asc2db1,5,6;定义加数Resultdb4dup(?);定义结果和存放单元dataendscodesegmentassumecs:code,ds:data,es:datastart:movax,datamovds,axmoves,axcld;清方向标志DF=0为增量串操作,2020/5/22,第10章数据运算程序设计,17,10.1多精度的加减运算,10.1.2压缩型BCD码加减运算,movsi,offsetasc1movbx,offsetasc2movdi,offsetresultmovcx,03h;计数值为3字节movah,00hskip:lodsasc1;alsi且sisi+1sahf;标志寄存器将保存在ah中的标志位adcal,bxaaa;非压缩BCD加法运算调整lahf;状态标志保存在ahoral,30h;al转换成ASCII码stosb;dial且didi+1incbx;修改加数地址loopskip,2020/5/22,第10章数据运算程序设计,18,10.1多精度的加减运算,10.1.2压缩型BCD码加减运算,andah,01h;ah截取ah中的CF位orah,30h;ah转换成ASCII码movdi,ah;ah送至结果的第四个字节movah,02h;ah2号调用movcx,04h;输出字符个数next:movdl,di;从高字节到低字节输出显示int21hdecdiloopnextmovax,4c00h;返回DOSint21hcodeendsendstart,2020/5/22,第10章数据运算程序设计,19,10.2乘除运算,第10章数据运算程序设计,10.1多精度的加减运算,2020/5/22,第10章数据运算程序设计,20,利用8088/8086CPU提供了乘法指令MUL和IMUL及除法指令DIV和IDIV,可以直接用于一般整数(字节或字)二进制乘除运算。利用乘除调整指令AAM、AAD配合完成十进制数的乘除运算。,10.2乘除运算,注意:在除法时除数不能为零,否则引起中断。,2020/5/22,第10章数据运算程序设计,21,10.2乘除运算,10.2.1一般整数二进制乘除运算,二进制乘法运算,乘法指令MULmem|reg;无符号二进制乘法IMULmem|reg;有符号二进制乘法乘积在AX或DX、AX中。乘数可以通过各种寻址方式给出。,2020/5/22,第10章数据运算程序设计,22,10.2乘除运算,10.2.1一般整数二进制乘除运算,例10.5在内存单元mem1和mem2分别存放一单字节有符号整数,编程求其乘积并存入result字单元中。,nameexp10-5.asmdatasegmentmem1db36;定义被乘数mem2db27;定义乘数resultdw0;定义结果积存放单元dataendscodesegmentassumecs:code,ds:data,2020/5/22,第10章数据运算程序设计,23,10.2乘除运算,start:movax,datamovds,axmovsi,offsetmem1movdi,offsetresultmoval,siimulmem2;用mul就变为无符号movdi,axmovax,4c00h;返回DOSint21hcodeendsendstart,10.2.1一般整数二进制乘除运算,2020/5/22,第10章数据运算程序设计,24,二进制除法运算,除法指令DIVmem|reg;无符号二进制乘法IDIVmem|reg;有符号二进制乘法商在AX或AL,余数在DX或AH中。,10.2乘除运算,10.2.1一般整数二进制乘除运算,注意:对有符号数除法,可以利用符号扩展指令得到倍长于除数的被除数对无符号数除法,采用直接使高8位或高16位清0,获得倍长的被除数。这就是零位扩展,2020/5/22,第10章数据运算程序设计,25,10.2乘除运算,10.2.1一般整数二进制乘除运算,nameexp10-6.asmdatasegmentmem1dw2006;定义双字节被除数mem2db20;定义单字节除数quotientdw0;定义商存储单元residualdw0;定义余数存储单元dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,ax,例10.6内存单元mem1存放一双字节被除数,mem2单元存放一单字节除数,它们均为无符号整数,编程求其商和余数,并分别存入quotient和residual单元中。,2020/5/22,第10章数据运算程序设计,26,movax,mem1;取被除数movbl,mem2;取除数cmpah,bl;判断被除数高字节除数?jbskip;不大于等于转skipxordx,dx;大于等于时将被除数扩展为四字节xorbh,bh;将除数扩展为双字节divbx;完成四字节除以双字节movquotient,ax;保存双字节商movresidual,dx;保存双字节余数jmpnextskip:divbl;完成双字节除以单字节,10.2乘除运算,10.2.1一般整数二进制乘除运算,2020/5/22,第10章数据运算程序设计,27,movbyteptrquotient,al;保存单字节商movbyteptrresidual,al;保存单字节余数next:movax,4c00h;返回DOSint21hcodeendsendstart,10.2乘除运算,10.2.1一般整数二进制乘除运算,2020/5/22,第10章数据运算程序设计,28,10.2乘除运算,10.2.2多字节整数十进制乘除运算,对于十进制的乘除运算,8088/8086CPU只提供了非压缩型BCD码的乘除运算调整指令,而没有提供压缩型BCD码的乘除运算调整指令。,2020/5/22,第10章数据运算程序设计,29,多字节非压缩型BCD码的乘法运算,10.2乘除运算,10.2.2多字节整数十进制乘除运算,乘法指令MULmem|reg;无符号二进制乘法没有IMUL指令乘积在AX或DX、AX中。乘数可以通过各种寻址方式给出。调整指令AAM,2020/5/22,第10章数据运算程序设计,30,例10.7用非压缩BCD码完成589726的运算,并将结果在显示器上输出显示。,10.2乘除运算,10.2.2多字节整数十进制乘除运算,nameexp10-7.asmdatasegmentaddr1db27985;定义被乘数58972addr2db6;定义乘数6resultdb6dup(?);定义存放结果单元dataendscodesegmentassumecs:code,ds:data,es:datastart:movax,datamovds,axmoves,axcld,2020/5/22,第10章数据运算程序设计,31,10.2乘除运算,10.2.2多字节整数十进制乘除运算,movsi,offsetaddr1movdi,offsetresultmovcx,5andaddr2,0fh;将乘数的高四位清零movbyteptrdi,0skip:lodsb;alsi且sisi+1andal,0fh;将被乘数对应的高四位清零muladdr2;从最低位开始相乘运算结果送axaam;十进制数乘法运算调整addal,di;加进位aaa;十进制数加法运算调整oral,30h;将结果位换成ASCII码stosb;dial且didi+1movdi,ah;存放当前运算结果进位loopskip;重复相乘运算5次,2020/5/22,第10章数据运算程序设计,32,10.2乘除运算,10.2.2多字节整数十进制乘除运算,orbyteptrdi,30hmovcx,6;输出乘积结果6位数next:movdl,di;从高位到低位开始输出显示movah,02h;2号系统功能调用显示int21hdecdiloopnext;重复输出显示6位乘积结果movax,4c00h;返回DOSint21hcodeendsendstart,2020/5/22,第10章数据运算程序设计,33,10.2乘除运算,10.2.2多字节整数十进制乘除运算,多字节非压缩型BCD码的除法运算,例10.8用非压缩BCD码完成826488的运算,并将结果在显示器上输出显示,nameexp10-8.asmdatasegmentaddr1db84628;定义被除数84628addr2db8;定义除数8resultdb6dup(?);定义存放结果单元dataendscodesegmentassumecs:code,ds:data,es:datasta
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论