
[汇编语言]子程序设计之多精度十进制加法
发布日期:2021-05-07 07:54:07
浏览次数:16
分类:精选文章
本文共 4882 字,大约阅读时间需要 16 分钟。
实验内容:
(1)将两个多精度十进制数相加。
(2)编写一个程序,他以二进制形式显示EAX中32位数据,并设计一个主程序验证。 (3)利用十六进制字节显示子程序DISPHB设计一个从低地址到高地址逐个字节显示某个主存区域内容的子程序DISPMEM。其入口参数:EAX=主存偏移地址,ECX=字节个数主存区域的长度。
实验要求:
1、 要求被加数和加数均以组合BCD码形式各自存放在以DATA1和DATA2为首的连续的5个内存单元中,结果送回被加数单元。
2、 设计一个子程序能够用ASCII码显示32位二进制 3、 设计一个子程序能够用ASCII码从低字节到高字节逐个显示。
实验代码
; six.asm in Windows Console;将两个多精度十进制数相加;要求被加数和加数均以组合BCD码形式;各自存放在以DATA1和DATA2为首的连续的5个内存单元中;结果送回被加数单元 include io32.inc .datadata1 byte 16h,35h,30h,38h,32h;定义多字节十进制数,以BCD码形式存放data2 byte 36h,35h,30h,38h,32h;定义多字节十进制数,以BCD码形式存放count1 = 5;计算被加数BCD码组有多少字节存放count2 = 5;计算加数BCD码组有多少字节存放msg1 byte 13,10,'The augend is: ',0msg2 byte 13,10,'The addend is: ',0result byte 13,10,'The result is: ',0 .codestart: ;显示被加数 mov esi,offset data1;si指向被加数首单元 mov ebx,count1;被加数BCD码组有多少字节表示即被加数多少位 mov eax,offset msg1; call dispmsg;显示被加数 call dispascii;用ASCII显示被加数 call dispcrlf;换行 ;显示加数 mov esi,offset data2;esi指向加数首单元 mov ebx,count2;加数BCD码组有多少字节表示即被加数多少位 mov eax,offset msg2 call dispmsg call dispascii;用ASCII显示加数 call dispcrlf;换行 ;做加法 mov esi,offset data1;si指向被加数首单元 mov edi,offset data2;di指向加数首单元 mov ecx,count1;BCD组数传送ecx call adda;调用加法子程序 ;显示和处理结果 mov esi,offset data1;esi指向结果首单元 mov ebx,count1;bcd组数 mov eax,offset result call dispmsg call dispascii;显示结果ascii call dispcrlf;换行 exit 0;子程序名:dispascii;功能:用ascii形式显示多组BCD数;入口参数:esi指向数据串首单元,ebx存放BCD码组字节数;无出口参数dispascii proc near add esi,ebx;esi指向数据串最后一个字符 dec esi;esi指向最后一字节BCD码首位(高位) mov ecx,ebx;表示BCD多少字节即循环数 des: mov dl,[esi];取最后一个字节送至dl,即最后一组BCD码 mov al,dl;复制dl内容存入al shr al,4;al中内容右移四位,得到字节中的高四位 or al,30h;加30h转换为ascii码 call dispc;显示字符,al=ascii码 and dl,0fh;得到字节中的低四位 or dl,30h;加30h转换为ascii码 mov al,dl;将低四位移入al显示 call dispc;显示字符 dec esi;调整指针,指向下一字节bcd码 dec ecx;循环次数减一(字节减1) jnz des;如果ecx不为零,则跳转继续循环 ret dispascii endp;子程序名:adda;功能:多精度组合bcd数加法;入口参数:esi指向被加数首单元,edi指向加数首单元,ecx送字节数BCD码组数;无返回参数adda proc near clc;把cf清零 ad: mov al,[esi];取被加数低地址bcd组 adc al,[edi];与加数相加,结果放置al中 daa;组合bcd数相加调整变成bcd码/两个16进制数相加AL=37H+35H=6C调整后al=72h mov [esi],al;结果送至被加数位置 inc esi;被加数取下一组bcd inc edi;加数取下一组bcd loop ad ret adda endp end start
eg2:
; six.asm in Windows Console;将两个多精度十进制数相加;要求被加数和加数均以组合BCD码形式;各自存放在以DATA1和DATA2为首的连续的5个内存单元中;结果送回被加数单元 include io32.inc .datadata1 dword 16h,35h,30h,38h,32h;定义多字节十进制数,以BCD码形式存放data2 dword 36h,35h,30h,38h,32h;定义多字节十进制数,以BCD码形式存放count1 = 20;计算被加数BCD码组有多少字节存放count2 = 20;计算加数BCD码组有多少字节存放msg1 byte 13,10,'The augend is: ',0msg2 byte 13,10,'The addend is: ',0result byte 13,10,'The result is: ',0 .codestart: ;显示被加数和加数 mov esi,offset data1;si指向被加数首单元 mov ebx,count1;被加数BCD码组有多少字节表示即被加数多少位 mov eax,offset msg1; call dispmsg;显示被加数 call dispascii;用ASCII显示被加数 call dispcrlf;换行 mov esi,offset data2;si指向加数首单元 mov ebx,count2;加数BCD码组有多少字节表示即被加数多少位 mov eax,offset msg2 call dispmsg call dispascii;用ASCII显示加数 call dispcrlf;换行 ;做加法 mov esi,offset data1;si指向被加数首单元 mov edi,offset data2;di指向加数首单元 mov ecx,count1;BCD组数传送cx call adda;调用加法子程序 ;显示和处理结果 mov esi,offset data1;esi指向结果首单元 mov ebx,count1;bcd组数 mov eax,offset result call dispmsg call dispascii;显示结果ascii call dispcrlf;换行 exit 0;子程序名:dispascii;功能:用ascii形式显示多组BCD数;入口参数:esi指向数据串首单元,ebx存放BCD码组字节数;无出口参数dispascii proc near add esi,ebx;esi指向数据串最后一个字符 sub esi,4;si指向最后一组BCD码(高位) des: ;mov dh,[si];取最后一个字节送至dh,即最后一组BCD码 mov edx,[esi];取最后一个字节送至dx,即最后一组BCD码 ;mov al,dh;复制dh内容存入al mov eax,edx;复制dx内容存入ax shr al,4;al中内容右移四位,得到字节中的高四位 ;shr eax,4;al中内容右移四位,得到字节中的高四位 or al,30h;加30h转换为ascii码 ;or eax,00000030h;加30h转换为ascii码 ;mov al,byte ptr eax call dispc;显示字符,al=ascii码 and dl,0fh;得到字节中的低四位 ;add edx,0000000fh;得到字节中的低四位 or dl,30h;加30h转换为ascii码 ;or edx,00000030h;加30h转换为ascii码 mov al,dl ;mov al,byte ptr edx;把低四位放置al call dispc;显示字符 sub esi,4;调整指针,指向下一组bcd码 sub ebx,4;循环次数减一(字节减4) jnz des;如果bx不为零,则跳转继续循环 ret dispascii endp;子程序名:adda;功能:多精度组合bcd数加法;入口参数:esi指向被加数首单元,edi指向加数首单元,ecx送字节数BCD码组数;无返回参数adda proc near clc;把cf清零 ad: ;mov al,[esi];取被加数低地址bcd组 mov eax,[esi];取被加数低地址bcd组 ;adc al,[di];与加数相加,结果放置al中 adc eax,[edi];与加数相加,结果放置eax中 daa;组合bcd数相加调整变成bcd码/两个16进制数相加AL=37H+35H=6C调整后al=72h ;mov [si],al;结果送至被加数位置 mov [esi],eax;结果送至被加数位置 add esi,4;被加数取下一组bcd add edi,4;加数取下一组bcd loop ad ret adda endp end start
实验体会:
通过实验可以了解子程序的设计以及掌握了数据传送和算术运算指令的使用,特别是清楚了各个指针寄存器的使用,BCD码的转换、知道了数据具体是如何存储的以及如何提取需要字节的数据内容。
写下这篇博客主要是想记录一下做过的实验,写的不好,请多多指教,互相交流,互相学习。
.
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年03月31日 21时25分39秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
现代3D图形编程学习-基础简介(2) (译)
2019-03-06
Github教程(3)
2019-03-06
vue实现简单的点击切换颜色
2019-03-06
vue3 template refs dom的引用、组件的引用、获取子组件的值
2019-03-06
深入浅出mybatis
2019-03-06
Zookeeper快速开始
2019-03-06
cas客户端流程详解(源码解析)--单点登录
2019-03-06
882. Reachable Nodes In Subdivided Graph
2019-03-06
402. Remove K Digits
2019-03-06
375. Guess Number Higher or Lower II
2019-03-06
650. 2 Keys Keyboard
2019-03-06
764. Largest Plus Sign
2019-03-06
214. Shortest Palindrome
2019-03-06
916. Word Subsets
2019-03-06
869. Reordered Power of 2
2019-03-06
1086 Tree Traversals Again
2019-03-06
1127 ZigZagging on a Tree
2019-03-06
1062 Talent and Virtue
2019-03-06
1045 Favorite Color Stripe
2019-03-06
B. Spreadsheets(进制转换,数学)
2019-03-06