[汇编语言]子程序设计之多精度十进制加法
发布日期: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秒