您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 安徽理工大学计算机汇编教程-数据运算程序设计
计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计18086/8088和ARM核汇编语言程序设计第10章数据运算程序设计计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计210.1多精度的加减运算10.2乘除运算第10章数据运算程序设计计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计3本节主要介绍多字节无符号二进制数的加减法运算程序设计,特别要注意运算中加法进位和减法借位问题。10.1.1二进制加减运算10.1多精度的加减运算计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计4加法运算10.1多精度的加减运算10.1.1二进制加减运算例10.1编制完成两个无符号的四字节二进制数的加法运算。如8090H+8182H8090H分解为字节加80H90H+8182H+81H82H10212H+1H(进1)12H(进1)02H把以上的字节看成为字,四字节可分为两个字的加法。由此可推出两个M个字节数的加等于作M次字节加或M/2次字加计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计510.1多精度的加减运算10.1.1二进制加减运算分解为寄存器加alal+[bx][bx]+cy(进cf)al(进cf)al计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计6汇编程序10.1多精度的加减运算10.1.1二进制加减运算nameexp10-1.asmdatasegmentaddr1db6ch,8ah,3bh,49haddr2db3eh,5bh,6fh,7dhresultdb0,0,0,0lenequ4dataends计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计7codesegmentassumecs:code,ds:datastart:movax,datamovds,axmovsi,offsetaddr1;si←取被加数addr1地址偏移量movbx,offsetaddr2;bx←取加数addr2地址偏移量movdi,offsetresult;di←取和result地址偏移量movcl,len;cl←字节数clc;清进位标志skip:moval,[si]adcal,[bx];完成字节加法mov[di],al;保存求和结果incsi;修改地址incbxincdideccl;字节计数jnzskipmovax,4c00h;返回DOSint21hcodeendsendstart10.1多精度的加减运算10.1.1二进制加减运算计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计810.1多精度的加减运算10.1.1二进制加减运算减法运算分解为寄存器减alal-[bx][bx]-cf(借cf)al(借cf)al计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计9nameexp10-2.asmdatasegmentaddr1dw8a6ch,493bh;定义4字节被减数addr2dw5b3eh,7d6fh;定义4字节减数resultdw2dup(?);定义存放差的单元lendw0002h;定义循环计数值为2个字dataends10.1多精度的加减运算10.1.1二进制加减运算计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计1010.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,[si]sbbax,[bx];完成字减法mov[di],ax;保存求差的结果计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计11incsi;修改被减数地址incsiincbx;修改减数地址incbxincdi;修改结果差地址incdiloopskipmovax,4c00h;返回DOSint21hcodeendsendstart10.1多精度的加减运算10.1.1二进制加减运算addsi,2计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计12压缩型BCD码运算即是每一个字节表示两位BCD码十进制数。10.1多精度的加减运算10.1.2压缩型BCD码加减运算如:1234十进制数表示压缩型BCD码为:12H34H即0001001000110100B加法可利用指令add、adc与daa调整指令来配合减法可利用指令sub、sbb与das调整指令来编程计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计13例10.3编写一四字节压缩型BCD码的减法运算。要求完成:result←96578342―6835149010.1多精度的加减运算10.1.2压缩型BCD码加减运算nameexp10-3.asmdatasegmentbcd1db42h,83h,57h,96hbcd2db90h,14h,35h,68hresultdb4dup(?)dataends计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计14codesegmentassumecs:code,ds:datastart:movax,datamovds,axmovcx,4movsi,0clc;清进位标志skip:moval,bcd1[si];取被减数sbbal,bcd2[si];对应位相减das;十进制减法调整movresult[si],al;保存求差的结果incsi;修改地址偏移量loopskip;循环运算4个字节movax,4c00h;返回DOSint21hcodeendsendstart10.1多精度的加减运算10.1.2压缩型BCD码加减运算计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计1510.1多精度的加减运算10.1.2非压缩型BCD码加减运算非压缩型BCD码运算即是每一个字节表示一位BCD码十进制数。如:1234十进制数表示非压缩型BCD码为:01H02H03H04H即00000001000000100000001100000100B加法可利用指令add、adc与aaa调整指令来配合减法可利用指令sub、sbb与aas调整指令来编程计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计1610.1多精度的加减运算10.1.2压缩型BCD码加减运算例10.4编程计算非压缩型BCD码(ASCII码)的加法运算。要求完成:result←832+651并将结果在屏幕上输出显示。nameexp10-4.asmdatasegmentasc1db‘2’,‘3’,‘8’;定义被加数asc2db‘1’,‘5’,‘6’;定义加数Resultdb4dup(?);定义结果和存放单元dataendscodesegmentassumecs:code,ds:data,es:datastart:movax,datamovds,axmoves,axcld;清方向标志DF=0为增量串操作计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计1710.1多精度的加减运算10.1.2压缩型BCD码加减运算movsi,offsetasc1movbx,offsetasc2movdi,offsetresultmovcx,03h;计数值为3字节movah,00hskip:lodsasc1;al←[si]且si←si+1sahf;标志寄存器←将保存在ah中的标志位adcal,[bx]aaa;非压缩BCD加法运算调整lahf;状态标志保存在ahoral,30h;al←转换成ASCII码stosb;[di]←al且di←di+1incbx;修改加数地址loopskip计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计1810.1多精度的加减运算10.1.2压缩型BCD码加减运算andah,01h;ah←截取ah中的CF位orah,30h;ah←转换成ASCII码mov[di],ah;ah送至结果的第四个字节movah,02h;ah←2号调用movcx,04h;输出字符个数next:movdl,[di];从高字节到低字节输出显示int21hdecdiloopnextmovax,4c00h;返回DOSint21hcodeendsendstart计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计1910.2乘除运算第10章数据运算程序设计10.1多精度的加减运算计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计20利用8088/8086CPU提供了乘法指令MUL和IMUL及除法指令DIV和IDIV,可以直接用于一般整数(字节或字)二进制乘除运算。利用乘除调整指令AAM、AAD配合完成十进制数的乘除运算。10.2乘除运算注意:在除法时除数不能为零,否则引起中断。计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计2110.2乘除运算10.2.1一般整数二进制乘除运算二进制乘法运算乘法指令MULmem|reg;无符号二进制乘法IMULmem|reg;有符号二进制乘法乘积在AX或DX、AX中。乘数可以通过各种寻址方式给出。计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计2210.2乘除运算10.2.1一般整数二进制乘除运算例10.5在内存单元mem1和mem2分别存放一单字节有符号整数,编程求其乘积并存入result字单元中。nameexp10-5.asmdatasegmentmem1db36;定义被乘数mem2db-27;定义乘数resultdw0;定义结果积存放单元dataendscodesegmentassumecs:code,ds:data计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计2310.2乘除运算start:movax,datamovds,axmovsi,offsetmem1movdi,offsetresultmoval,[si]imulmem2;用mul就变为无符号mov[di],axmovax,4c00h;返回DOSint21hcodeendsendstart10.2.1一般整数二进制乘除运算计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计24二进制除法运算除法指令DIVmem|reg;无符号二进制乘法IDIVmem|reg;有符号二进制乘法商在AX或AL,余数在DX或AH中。10.2乘除运算10.2.1一般整数二进制乘除运算注意:对有符号数除法,可以利用符号扩展指令得到倍长于除数的被除数对无符号数除法,采用直接使高8位或高16位清0,获得倍长的被除数。这就是零位扩展计算机科学与技术系《汇编语言程序设计》2020/2/16第10章数据运算程序设计2510.2乘除运算10.2.1一般整数二进制乘除运算nameexp10-6.asmdatasegmentmem1dw2006;定义双字节被除数mem2db20;定义单字节除数quotientdw0;定义商存储单元residualdw0;定义余数存储单元dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,ax例10.6内存单元mem1存放一双字节被除
本文标题:安徽理工大学计算机汇编教程-数据运算程序设计
链接地址:https://www.777doc.com/doc-3819190 .html