实验内容:
(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
.data
data1 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: ',0
msg2 byte 13,10,'The addend is: ',0
result byte 13,10,'The result is: ',0
.code
start:
;显示被加数
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
.data
data1 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: ',0
msg2 byte 13,10,'The addend is: ',0
result byte 13,10,'The result is: ',0
.code
start:
;显示被加数和加数
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码的转换、知道了数据具体是如何存储的以及如何提取需要字节的数据内容。
写下这篇博客主要是想记录一下做过的实验,写的不好,请多多指教,互相交流,互相学习。