燕山大学微机原理作业
《微型计算机原理及应用》
班级:14级轧钢2班 姓名:谢文
学号:[1**********]1
作业指导教师:陈子明 王鑫 朱学军 张庆玲 赵玉勤 王志松 唐艳华
作业完成时间:2016/12/13
一. 题24.1问题描述 ................................................................................................................. 2 1.1寄存器及主存的应用说明 .................................................................................................... 2 1.2程序框图 ................................................................................................................................ 2 1.3详细程序 ................................................................................................................................ 2 1.4程序调试情况 ........................................................................................................................ 3 二. 题24.2问题描述 ................................................................................................................. 5 2.1寄存器及主存的应用说明 .................................................................................................... 5 2.2程序框图 ................................................................................................................................ 6 2.3详细程序 ................................................................................................................................ 6 2.4程序调试状况 ........................................................................................................................ 7 三. 题24.3问题描述 ................................................................................................................. 9 3.1寄存器及主存的应用说明 .................................................................................................... 9 3.2程序框图 ................................................................................................................................ 9 3.3详细程序 ................................................................................................................................ 9 3.4程序调试情况 ...................................................................................................................... 12 四. 体会和建议 ......................................................................................................................... 12
一. 题24.1问题描述
内存source处存放着20个ASCII码字符,从键盘输入一个字符,若输入的是为‘a’-‘z’之间的字符(例如g),则将source处的20个ASCII码字符传送至result处,传送时要求将‘a’-‘z’之间的字符转换成大写字符,而其他字符不变,并统计与输入字符(‘g’)相同的字符的个数,存入变量num中,程序结束;若输入的是其他字符,则在下一行显示‘ERROR!’,程序结束。 1.1寄存器及主存的应用说明
内存:source处存放待检测的字符 count处存放字符数量
result处存放修改过的新的字符
num处存放与输入字符相同的字符的个数 error处存放回车换行及字符串ERROR!
寄存器:bx用于使result指向的地址每次加1以存放下一个字符 al用于存放输入的字符 si用于存放地址
dl用于存放si指向的字符 cx用于计数 1.2程序框图(见第四页) 1.3详细程序 .model small .stack .data
source db 'abcdgggg456789AB+-*/' count equ $-source result db count dup(?) num db 0
error db 0dh,0ah,'ERROR!$' .code
.startup
xor bx,bx ;bx清零
mov ah,1 ;输入一个字符 int 21h cmp al,'a' ;输入的字符与a比较,如果比a jb done ;小或比z大则跳转至done cmp al,'z' ja done
lea si,source ;把首地址赋值给si
mov cx,count ;cx赋值循环次数
again: mov dl,[si] ;si指向的字符赋值给dl cmp dl,'a' ;若此字符比a小或比z大,则跳 jb one ;转至one cmp dl,'z' ja one
cmp dl,al ;若此字符在a-z之间,则与输入 jnz two ;的字符比较,不相等则跳至two add num,1 ;若相等则num加1
two:sub dl,20h ;将小写字符转换成大写字符 one:mov result[bx],dl ;将此字符存入result处 inc bx ;地址加1以存放下一个字符 inc si ;指向下一个待检测字符 loop again ;循环
jmp three ;跳转至three done:
mov dl,0dh ;回车,换行,显示ERROR! mov ah,2 int 21h mov dl,0ah mov ah,2 int 21h
mov dx,offset error mov ah,9 int 21h
three: ;结束 .exit end
1.4程序调试情况
第一次错误:语句one编写如下, mov result,dl inc result inc si loop again
原以为inc result会使地址加1,结果是result存储的值加1,导致第一个数加了20而其他数值没变,运行结果如图:
其中source和result有20个字符,由于图片清晰度问题,所以没有全部截图出来
第二次错误:刚开始给cx赋值为20,而实际应该赋值count,如果source存入21个字符,运行结果将只有20个字符。 正确的运行结果如下图:
二. 题24.2问题描述
内存中source处存放着一个以0为结束标志的ASCII码字符串,该字符串表示的是一个字型有符号整数。请将其转换为对应的有符号整数,存放到自变量result处。转换过程中,若遇到‘0’-‘9’及‘+’,‘-’以为的字符,或者转换结果超过了字型有符号数的范围(-32768-+32767),则显示‘ERROR!’,程序结束。 2.1寄存器及主存的应用说明 内存
source 处存放待检测字符
result处存放转换后的字型 error处存放字符串 寄存器:
bx存放取出的数值 cx存放标志数值 si存放地址
2.2程序框图(见第八页) 2.3详细程序 .model small .stack .data
source db '-12345',0 result dw ?
error db 'ERROR!$' .code .startup
lea si,source xor bx,bx xor dx,dx
cmp byte ptr[si],0 jz done
cmp byte ptr[si],'-' mov cx,-1 jz one cmp byte ptr[si],'+' mov cx,0 jz one cmp byte ptr[si],31h jb four cmp byte ptr[si],39h ja four dec si one:inc si cmp byte ptr[si],0 jz two
shl bx,1 mov dx,bx shl bx,1
;首地址赋值给si ;bx,dx分别清零
;第一个字符是0,则跳转至done ;若不是0则与‘-’比较 ;cx赋值-1作为标志 ;跳转至one ;与‘+’比较
;cx赋值0作为标志 ;跳转至one
;若既不是‘-’也不是‘+’则 ;与1比较,比1小,跳至four ;若比1大,则与9比较,比9 ;大,则跳转至four
;第一个字符为数字,则si减1 ;si加1指向下一个字符 ;与0比较,相等则结束 ;以下5句将bx通过移位乘10
;但第一次bx为0
shl bx,1 add bx,dx
mov ax,[si] ;si指向的数赋值给ax xor ah,ah ;只保留低位 sub ax,30h ;ASCII码减30取出第一个数 add bx,ax ;赋值给bx jmp one
two:cmp cx,-1 ;cx与-1比较
jnz five ;不相等跳转至five
cmp bx,32768 ;cx=-1,则bx与32768比较 ja four ;比32768大则跳转至four jmp nega ;否则跳转至nega five:cmp bx,32767 ;cx=0,则bx与32767比较 ja four ;大于32767则跳转至four jmp three ;否则跳转至three nega:not bx ;bx取反 add bx,1 ;b加1
three: mov result,bx ;bx赋值给result jmp done ;跳转至done four: mov dx,offset error ;显示错误 mov ah,9 int 21h
done: ;结束 .exit End
2.4程序调试状况
第一次错误:寄存器ax的高8位没有清零,使ax存储的数据不正确,结果出现错误。 第二次错误:与1和9比较大小时应用它们的ASCII码31h和39h,而不是直 接用1和9。
燕山大学
正确运行结果截图:
三. 题24.3问题描述
内存中source处存放着一个以0为结束标志的ASCII码字符串。请统计该字符串中字母,数字,空格和其他字符的个数,统计结果分别存放到字节型变量result处。
3.1寄存器及主存的应用说明
内存:source处存放待检测字符串 Result处存放各种字符数量 寄存器:si存储地址
cl存放si指向的字符 3.2程序框图(见第十一页) 3.3详细程序 .model small .stack .data
source db 'ABC abc 123 +-*/',0 result db 4 dup(0) .code .startup
lea si,source-1 ;si赋值source的首地址减1 again: inc si ;地址加1指向下一个字符 mov cl,[si] ;将指向的字符赋值给cl cmp cl,0 ;与0比较,如果是0,结束 jz done cmp cl,2BH ;分别于加减乘除比较,如果是其中的 jz others ;一个字符,跳转到others cmp cl,2DH jz others
cmp cl,2AH
jz others
cmp cl,2FH
jz others
cmp cl,20h
jz space
cmp cl,39h
jbe num
jmp words
others:
add [result+3],1
jmp again
space:
add [result+2],1
jmp again
num:
add [result+1],1
jmp again
words:
add [result],1
jmp again
done:
.exit
end
;与空格比较,相等则跳转到space ;以上字符都不是则与9比较, ;小于等于9则跳转到num ;如果以上都不是则为字母,跳转到words ;其他字符数量加1并存到result第四个字节处 ;继续执行搜索下一个字符 ;空格数量加1并存到result第三个字节处 ;继续执行搜索下一个字符 ;数字数量加1并存到result第二个字节处 ;继续执行并搜索下一个字符 ;字母数量加1并存到result第一个字节处 ;继续执行并搜索下一个字符 ;结束 10
11
3.4程序调试情况
错误:最后的一段程序没有写jmp again,导致无法循环,运行结果只有记录字母的数值是1,其他都为0,如下图:
由于图片清晰度原因,source字符数量没有全部截图
正确结果截图:
四. 体会和建议
体会:通过这次实际编程,我更加深刻的理解了课本及老师所讲的知识,更熟练的使用各种语句及命令,同时也体会到了编程时一些小技巧的重要性,有时,很简单的一段语句可以解决一个很麻烦的问题,实践真的很重要,感谢老师给的实践机会
建议:尽量避免程序化的东西,多让同学们实践,这样才能将所学知识理解的更加透彻,能力才能得到提高。
12