燕山大学微机原理作业

燕山大学微机原理作业
燕山大学微机原理作业

燕山大学微机原理作业 Prepared on 22 November 2020

《微型计算机原理及应用》作业作业组别:24

班级:12级机设1班

姓名:杨亚成

作业指导教师:(任课教师、实验室教师)

陈子明王鑫朱学军张庆玲赵玉勤王志松唐艳华

作业完成时间:2015/4/12

一.题问题描述

内存source处存放着20个ASCII码字符,从键盘输入一个字符,若输入的是为‘a’-‘z’之间的字符(例如g),则将source处的20个ASCII码字符传送至result处,传送时要求将‘a’-‘z’之间的字符转换成大写字符,而其他字符不变,并统计与输入字符(‘g’)相同的字符的个数,存入变量num中,程序结束;若输入的是其他字符,则在下一行显示

‘ERROR!’,程序结束。

寄存器及主存的应用说明

内存:source处存放待检测的字符

count处存放字符数量

result处存放修改过的新的字符

num处存放与输入字符相同的字符的个数

error处存放回车换行及字符串ERROR!

寄存器:bx用于使result指向的地址每次加1以存放下一个字符

al用于存放输入的字符

si用于存放地址

dl用于存放si指向的字符

cx用于计数

程序框图(见第四页)

详细程序

.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

程序调试情况

第一次错误:语句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个字符。

正确的运行结果如下图:

二.题问题描述

内存中source处存放着一个以0为结束标志的ASCII码字符串,该字符串表示的是一个字型有符号整数。请将其转换为对应的有符号整数,存放到自变量result处。转换过程中,若遇到‘0’-‘9’及‘+’,‘-’以为的字符,或者转换结果超过了字型有符号数的范围(-32768-+32767),则显示‘ERROR!’,程序结束。

寄存器及主存的应用说明

内存

source 处存放待检测字符

result处存放转换后的字型

error处存放字符串

寄存器:

bx存放取出的数值

cx存放标志数值

si存放地址

程序框图(见第八页)

详细程序

.model small

.stack

.data

source db '-12345',0

result dw

error db 'ERROR!$'

.code

.startup

lea si,source ;首地址赋值给si

xor bx,bx ;bx,dx分别清零

xor dx,dx

cmp byte ptr[si],0 ;第一个字符是0,则跳转至done

jz done

cmp byte ptr[si],'-' ;若不是0则与‘-’比较

mov cx,-1 ;cx赋值-1作为标志

jz one ;跳转至one

cmp byte ptr[si],'+' ;与‘+’比较mov cx,0 ;cx赋值0作为标志

jz one ;跳转至one

cmp byte ptr[si],31h ;若既不是‘-’也不是‘+’则

jb four ;与1比较,比1小,跳至four

cmp byte ptr[si],39h ;若比1大,则与9比较,比9

ja four ;大,则跳转至four

dec si ;第一个字符为数字,则si减1

one:inc si ;si加1指向下一个字符

cmp byte ptr[si],0 ;与0比较,相等则结束

jz two

shl bx,1 ;以下5句将bx通过移位乘10

mov dx,bx ;但第一次bx为0

shl bx,1

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

程序调试状况

第一次错误:寄存器ax的高8位没有清零,使ax存储的数据不正确,结果出现错误。

第二次错误:与1和9比较大小时应用它们的ASCII码31h和39h,而不是直

接用1和9。

正确运行结果截图:

三.题问题描述

内存中source处存放着一个以0为结束标志的ASCII码字符串。请统计该字符串中字母,数字,空格和其他字符的个数,统计结果分别存放到字节型变量result处。

寄存器及主存的应用说明

内存:source处存放待检测字符串

Result处存放各种字符数量

寄存器:si存储地址

cl存放si指向的字符

程序框图(见第十一页)

详细程序

.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 ;与空格比

较,相等则跳转到space

jz space

cmp cl,39h ;以上字符都不是则

与9比较,

jbe num ;小于等于9则跳转

到num

jmp words ;如果以上都不是则为字母,跳转到words others:

add [result+3],1 ;其他字符数量加1并存到result第四个字节处jmp again ;继续执行搜索下一

个字符

space:

add [result+2],1 ;空格数量加1并存到result第三个字节处

jmp again ;继续执行搜索下一

个字符

num:

add [result+1],1 ;数字数量加1并存到result第二个字节处

jmp again ;继续执行并搜索下

一个字符

words:

add [result],1 ;字母数量加1并存到result第一个字节处

jmp again ;继续执行并搜索下

一个字符

done: ;结束

.exit

end

程序调试情况

错误:最后的一段程序没有写jmp again,导致无法循环,运行结果只有记录字母的数值是1,其他都为0,如下图:

由于图片清晰度原因,source字符数量没有全部截图

正确结果截图:

四.体会和建议

体会:通过这次实际编程,我更加深刻的理解了课本及老师所讲的知识,更熟练的使用各种语句及命令,同时也体会到了编程时一些小技巧的重要性,有时,很简单的一段语句可以解决一个很麻烦的问题,实践真的很重要,感谢老师给的实践机会

建议:尽量避免程序化的东西,多让同学们实践,这样才能将所学知识理解的更加透彻,能力才能得到提高。

相关主题
相关文档
最新文档