微机原理实验1.docx
《微机原理实验1.docx》由会员分享,可在线阅读,更多相关《微机原理实验1.docx(17页珍藏版)》请在冰豆网上搜索。
微机原理实验1
信息与通信工程学院
微机原理软件实验报告
(二)
班级:
姓名:
学号:
序号:
日期:
2014年12月
一、实验目的
1)掌握MASM的操作步骤,能够将源程序编译成可执行文件
2)掌握简单的DOS功能调用
3)掌握简单的汇编语言程序的设计
二、实验任务
1.编一程序,在显示器上显示256个ASCII代码,要求显示格式为每行显示16个字符,两个ASCII字符间空一格。
2.试编一程序,把地址偏移量为100H单元开始的256个单元分别写入:
00H,01H,02H,03H,…,FFH数据。
统计写入的数据块中0元素、正元素、负元素的个数,并分别把统计结果送人上述数据块之后的三个单元中。
用DOS功能调用显示上面两题中数据块各单元(包括统计结果)内容。
为了显示清晰明了,要求每行显示16个数据,两个数据之间用空格分开。
(教材P185第1、2、3题合到一起编一完整的程序。
)
3.编一程序,把键入的十六进制数转换成十进制数并在屏幕上显示出来。
键入的最大数为FFFFH,若键人的不是十六进数字,则显示出错提示。
(教材P188第21题。
)
三、实验内容
1.显示256个ASCII码
(1)源程序(附注释):
datasegment;定义数据段
bufdb256dup(?
)
countequ$-buf;将buf定义的字节长度赋值给count
dataends
codesegment;定义代码段
assumeds:
data,cs:
code
start:
movax,data
movds,ax
movsi,offsetbuf;设置数据块首地址
movcx,count;设定循环次数
cld;地址修改为增量
xorax,ax
xordx,dx
xorbx,bx
hyone:
mov[si],al;将数据存入数据段
incsi
incal
loophyone
movsi,offsetbuf;指向数据块首地址
movcx,count-1
hytwo:
movdl,[si];显示数据段的内容
movah,2
int21h
movdl,20h;插入空格
movah,2
int21h
incsi
incbl;设定为换行指示标志
cmpbl,10h;当显示了16个字符之后就换行
jzhythree
loophytwo
;回车换行
hythree:
movdl,0dh
movah,02h
int21h
movdl,0ah
movah,02h
int21h
xorbl,bl;将换行指示标志重新置为0
cmpcx,0;判断是否显示完
jnzhytwo;没有显示完的话继续显示
jzhyfour;显示完结束程序
hyfour:
movah,4ch;终止程序
int21h
codeends
endstart
(2)程序流程图:
图1
2.写入数据,统计各类元素个数
(1)源程序(附注释):
datasegment;定义数据段
org100h;设定初始偏移量为100h
bufdb259dup(?
);定义259个数据存放地址
countequ$-buf;将buf定义的字节长度赋值给count
hydb0;定义变量hy作为空格显示控制标志
dataends
codesegment;定义代码段
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movsi,offsetbuf;设置数据块首地址
movcx,count-3;将循环次数存入cx中
cld;地址修改为增量
xorbx,bx
xorax,ax
xordx,dx
hyone:
mov[si],al;将数据存入数据段
incsi
incal
loophyone
movsi,offsetbuf;指向数据块首地址
movcx,count-3;将循环次数存入cx中
lodsb;把si指向的存储单元读入累加器
hytwo:
moval,[si]
andal,al
jzzero;如果为0的话则跳转到zero
jnspositive;如果大于0的话则跳转到positive
jsnegtive;如果小于0的话则跳转到negtive
zero:
incbl;统计为0的个数,用bl计数
jmphythree
positive:
incbh;统计大于0的个数,用bh计数
jmphythree
negtive:
incdl;统计小于0的个数,用dl计数
jmphythree
hythree:
incsi;si加一
loophytwo;继续判断下一个数
hyfour:
decsi;先执行后判断所以si要减1
;将0的个数存入数据块之后的第一个单元
mov[si],bl
incsi
;将大于0的个数存入数据块之后的第二个单元
mov[si],bh
incsi
;将小于0的个数存入数据块之后的第三个单元
mov[si],dl
movsi,offsetbuf;指向数据块首地址
movcx,count;设置循环次数
done:
moval,[si];将数据段的内容赋值给al
movbh,al;暂存数据
;右移4位
shral,1
shral,1
shral,1
shral,1
calldisp
moval,bh;将暂存的数据送回al
andal,0fh;屏蔽掉高四位
calldisp
incsi
loopdone
movah,4ch;终止程序
int21h
dispproc
cmpal,0ah;与0ah比较,小于0ah,加30h
jshyfive;大于0ah,为十六进制数A~F,加37h
addal,7
hyfive:
addal,30h
movdl,al;dos功能调用显示字符
movah,02
int21h
inchy
cmphy,02
jzhyseven
ret
;根据空格显示标志符hy的大小判断是否插入空格
hyseven:
movdl,20h;插入空格
movah,2
int21h
incdh
movhy,0
cmpdh,10h
jzhysix
ret
hysix:
movdl,0dh;回车换行
movah,02h
int21h
movdl,0ah
movah,02h
int21h
xordh,dh
ret
dispendp
codeends
endstart
(2)程序流程图
图2
3.十六进制数转换成十进制数
(1)源程序(附注释):
namehexdec
codesegment
assumecs:
code
;提示信息
msg1db'erronumber','$'
msg2db'Hello!
Pleaseinputthehexadecimalnumber:
','$'
msg3db'Hello!
Toexitthisprogram,youonlyhavesixchances','$'
msg4db'numberoverflow','$'
hydb0
countdb0
crlfmacro;定义宏指令,回车换行
movdl,0dh
movah,02h
int21h
movdl,0ah
movah,2
int21h
endm
start:
movax,segcode
movds,ax;给数据段赋值,与代码段在同一个段
;提示正确调试的机会只有6次
begin:
crlf
movdx,offsetmsg3
movah,09
int21h
crlf
main:
crlf
movdx,offsetmsg2;提示输入一个十六进制的数
movah,09
int21h
crlf
callhexbin;从键盘接收进制的数并转化为二进制
crlf
callbindec;把二进制转化为十进制数
crlf
movhy,0;重置输入次数标志
inccount;正确调试次数加1
cmpcount,6;如果已经正确调试六次则退出程序
jzdone
jmpmain
done:
movah,4ch;退出程序
int21h
;接收键盘输入的十六进制数据,并转化为二进制子程序
hexbinprocnear
xorbx,bx
newchar:
movah,01
int21h
cmpal,0dh;若输入回车则结束本程序
jzretu
;统计输入的十六进制数长度,如果大于ffffh则溢出报错
inchy
cmphy,5
jzbck;溢出报错
subal,30h
jlexit;键入的字符小于0,为非法字符
cmpal,9
jleaddto;键入的字符大于0,小于9,移位处理
subal,07;判断是否为字母A~F
cmpal,0ah;不是大于A的字母为非法字母
jlexit
cmpal,0fh;判断是否为a~f
jgnext
addto:
movcl,4
shlbx,cl;键入的字符左移四位,先键入的字符移向高位
movah,0
addbx,ax;把刚键入的字符与前面的字符和在一起
jmpnewchar
;溢出报错
bck:
movhy,0
xorbx,bx
xorax,ax
crlf
movdx,offsetmsg4
movah,09
int21h
crlf
jmpmain
next:
subal,20h;判断是否为小写a~f
cmpal,0ah
jlexit;小于a为非法字符
cmpal,0fh;大于f为非法字符
jleaddto
jgexit
jmpretu
retu:
ret
;输入