《微型计算机原理及应用》作业
作业组别:第30组
班级:12级轧钢二班
姓名:贾闯
学号:120101020023
指导教师:李艳文
完成时间:2015年 05 月
30.1
一、题目及题目分析描述及要求
题目:内存中SOURCE处存放着10个字节型数据,请记录每个字节数据中二进制位1的个数,并按照数据字节在前,1的个数在后的顺序将处理结果存放到RESULT处。
分析:逐一取出内存中的10个数据,对每个字节型数据进行左移或右移八次,由带进位加法指令adc对一的个数进行求和,最后把所求和放入变量RESULT中。
预期结果:SOURCE = FEH,90H,FFH,DDH,42H,30H,81H,F3H,18H,25H
RESULT = FEH,07H,90H,02H,FFH,08H,DDH,06H,42H,02H,30H,02H,81H,02H,F3H,
06H,18H,02H,25H,03H
二、寄存器及主存等的应用说明
本题原始数据存放在内存SOURCE中,执行结果存放在内存RESULT中。
由si和di分别取得它们的偏移地址,dl存放由SOURCE所取的字节型数据,al用来存放每个字节型数据中二进制位1的个数。
三、程序框图
四、详细程序
.MODEL SMALL
.STACK
.DATA
SOURCE DB 0FEH,90H,0FFH,0DDH,42H,30H,81H,0F3H,18H,25H
COUNT EQU $-SOURCE ;取得source中字节个数RESULT DB 2*COUNT DUP (?)
.CODE
.STARTUP
mov di,offset source ;取得source处的偏移地址 mov si,offset result ;取得result处的偏移地址 mov ch,0
mov cl,count ;循环次数
again: mov dl,[di] ;逐一取出source中的数据 call htoasc ;调用子程序
inc di ;地址加1
loop again
.exit
htoasc proc ;子程序
mov al,0
mov [si],dl ;存放dl到result
next: shr dl,1 ;右移
adc al,0 ;带进位加法,确定1的个数 cmp dl,0 ;dl为零停止循环
jnz next
mov [si+1],al ;存放1的个数到result
inc si ;地址加2
inc si
ret ;返回主程序
htoasc endp
end
五、程序调试的情况、程序运行的结果的分析
刚开始调试时,总感觉寄存器不够用,经过翻阅课本,发现si,di也可以用来取偏移地址。
程序执行结果如下:
另外后来又学习到通过堆栈保护寄存器可以避免寄存器不够用的尴尬,以后可以用堆栈对其加以保护。
30.2
一、题目及题目分析描述及要求
题目:内存SOURCE中存放着10个0至9之间的数字的ascii码或者空白符的ascii 码,要求将0至9之间的数字的ascii码转换为相应的八位二进制数,并将空白字符的ascii码转换为“$”字符的ascii码。
处理结果存放到result处。
分析:分别取出source中的数据或空白字符,与空白字符的ascii码进行比较,若相等则转换为“$”字符的ascii码,若不等则将其减去30h转换为相应的二进制数。
预期结果:SOURCE = 20H, 30H, 31H, 33H, 35H, 20H, 39H, 38H, 37H, 34H RESULT = 24H, 00H, 01H, 03H, 05H, 24H, 09H, 08H, 07H, 04H
二、寄存器及主存等的应用说明
本题原始数据存放在内存SOURCE中,执行结果存放在内存RESULT中。
由si和di分别取得它们的偏移地址,dl存放由SOURCE所取的字节型数据,al用来作为中间过渡量。
三、程序框图
四、详细程序
.MODEL SMALL
.STACK
.DATA
SOURCE DB 20H, 30H, 31H, 33H, 35H, 20H, 39H, 38H, 37H, 34H
COUNT EQU $-SOURCE ;取得source中字节数
RESULT DB COUNT DUP (?)
.CODE
.STARTUP
mov ch,0
mov cl,count ;设定循环次数
mov si,offset source ;取得source的偏移地址
mov di,offset result ;取得result的偏移地址
again: mov dl,[si] ;逐一取出source中的数据
cmp dl,20h ;如果取出的数据为20h则跳转到next1 jz next1 否则减去30h
sub dl,30h
mov al,dl
jmp next2
next1: mov al,24h
next2:
mov [di],al ;存放al数值到result处
inc si ;si地址加1
inc di ;di地址加1
loop again
.EXIT
END
五、程序调试的情况、程序运行的结果的分析:
程序调试情况如下:
达到了预期的结果:
本题与第一题有相似之处,故完成起来比较简单。
本题仍可加以改进,对其进行堆栈保护,这样可以避免寄存器不够用甚至寄存器串用的问题。
30.3
一、题目及题目分析描述及要求
题目:内存中numa与numb处各存放着10个字节型无符号整数,请将它们按元素对应的逐个进行比较。
如果numa中的元素大于numb中的相应的元素的数目多于numb中的元素大于numa中的相应的元素的数目,则显示numa>numb,否则请显示numa<numb或numa=numb
分析:逐一比较numa与numb中相应的的数据,最后统计numa>numb或numa<numb的次数,最后进行比较并进行相应的输出。
预期结果:信息框输出执行结果
二、寄存器及主存等的应用说明
本题原始数据存放在内存numa、numb中。
由si和di分别取得它们的偏移地址,然后逐一比较numa
三、程序框图
四、详细程序
.MODEL SMALL
.STACK
.DATA
NUMA DB 10H, 11H, 12H, 13H, 00H, 95H, 86H, 97H, 08H, 89H
COUNT EQU $-NUMA ;取得numa中字节数
NUMB DB 90H, 81H, 66H, 3AH, 4CH, 37H, 64H, 1EH, 27H, 59H
STR1 DB 'NUMA>NUMB$'
STR2 DB 'NUMA<NUMB$'
STR3 DB 'NUMA=NUMB$'
.CODE
.STARTUP
mov si,offset numa ;取得numa偏移地址
mov di,offset numb ;取得numb偏移地址
mov ch,0
mov cl,count ;确定循环次数
mov bl,0 ;al,bl赋初值为0
mov al,0
again:mov dl,[di] ;dl作为中间寄存器以进行比较
cmp [si],dl ;比较numa与numb中相应数值大小 inc si ;si地址加1
inc di ;di地址加1
ja next1 ;numa>numb跳到next1进行累加
jb next2 ;numa<numb跳到next2进行累加
jmp next3
next1:add bl,1
jmp next3
next2:add al,1
next3:
loop again
cmp bl,al ;比较bl与al
ja label1
jb label2
mov dx,offset str3
jmp label3
label1:
mov dx,offset str1
jmp label3
label2:
mov dx,offset str2
jmp label3
label3:
mov ah,09h ;执行09号功能显示执行结果 int 21h
.EXIT
END
五、程序调试的情况、程序运行的结果的分析:
程序运行情况如下:
执行结果如下:
该题主要是对numa与numb中的数据进行比较,最后执行09号功能进行显示。
10。