微原实验报告二.docx
- 文档编号:10282656
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:16
- 大小:110.87KB
微原实验报告二.docx
《微原实验报告二.docx》由会员分享,可在线阅读,更多相关《微原实验报告二.docx(16页珍藏版)》请在冰豆网上搜索。
微原实验报告二
实验二:
汇编语言程序设计
一、实验目的
1)掌握MASM的操作步骤,能够将源程序编译成可执行文件。
2)掌握简单的汇编语言程序的设计(建立及调试)。
二、实验任务及内容
1.实验任务
①、编一程序,在显示器上显示256个ASCII代码,要求显示格式为每行显示16个字符,两个ASCII字符间空一格。
②、将地址偏移量为100H单元开始的256个单元写入00h,01h,02h…ffh,并统计正负0元素个数写入数据块之后的三个单元中,并用DOS调用将各数据块中的内容显示出来。
③、将键入的16进制数转化为十进制数显示出来,键入最大值为ffffh,若键入的不是十进制数则显示出错信息。
2.源程序
1.DATASEGMENT;定义数据段
DB256DUP(?
)
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA;数据段赋值
MOVDS,AX
MOVCX,256
MOVDH,0
LOP:
TESTDH,00001111B;判断是否显示16个字符换行
JNZNEXT
MOVDL,13;换行
CALLDISP
MOVDL,10
CALLDISP
NEXT:
MOVDL,DH;显示字符
CALLDISP
MOVDL,'';两字符间加空格
CALLDISP
INCDH;使用DH计数
LOOPLOP
DONE:
;退出程序
MOVAH,4CH
INT21H
DISPPROCNEAR;在屏幕上显示字符
PUSHAX
MOVAH,2
INT21H;DOS功能调用
POPAX
RET
DISPENDP
CODEENDS
ENDSTART
2.datasegment
;inputdatasegmentcodehere
org100h
bufdb259dup(?
)
countequ$-buf
dataends
stacksegment
;inputstacksegmentcodehere
sdb256dup(?
)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
movds,ax
movax,stack
movss,ax
movsp,offsets
movsi,offsetbuf
movcx,256
xorax,ax
xorbx,bx
xordh,dh
next:
mov[si],al
cmpal,0h
jzzero;如果这个数为0,则0的个数加一
cmpal,80H
janega;同理负数个数加一
jmppos
zero:
incdh
;deccx
incal
jmpnext2
nega:
incbl
;incsi
incal
jmpnext2
pos:
incbh
incal
jmpnext2
next2:
incsi
loopnext
mov[si],dh;将等于0的数的多少装入dh,再放在数据块之后
incsi
mov[si],bx
movsi,offsetbuf
movcx,count
zrbh:
movbh,16;每行显示16个,便于观看
next3:
moval,[si]
movbl,al
shral,1;右移4位,比较高四位
shral,1
shral,1
shral,1
cmpal,0ah;判断高四位是字母还是数字
jcjia30;如果是数字,加30h变成对应的ASCII码
addal,07h;如果是字母,则要加37
jia30:
addal,30h
callDIS;显示高四位
;INT21H
moval,bl;恢复原来的数
andal,0fh;屏蔽高四位
cmpal,0ah
jcjia30a
addal,7h
jia30a:
addal,30h
callDIS
moval,20h;在两个数之间加一个空格,便于显示
callDIS
incsi
loopnext4;循环完毕,当不再loop时,跳转至程序结束的地方
jmpstop
next4:
decbh
jnznext3
moval,0ah;若有16个数,则送回车,换行0ah,0dh
callDIS
;MOVAH,0BH
moval,0dh
callDIS
jmpzrbh;继续处理下一行
;inputcodesegmentcodehere
stop:
movah,4ch
int21h
DISprocnear
movdl,al
movah,2
int21h
;MOVAH,0BH
RET
;movdl,al
DISendp
codeends
endstart
3.datasegment
overdb'errorcharacter!
$'
dataends
stacksegment
sdb512dup(?
)
stackends
codesegment
assumecs:
code,ds:
data,ss:
stack
crlfmacro;定义宏,送回车换行符
movdl,0dh
movah,2
int21h
movdl,0ah
movah,2
int21H
endm
start:
movax,data
movds,ax
movax,stack
movss,ax
movsp,offsets
main:
callhexbin
crlf
callbindec
crlf
jmpmain
;接受的十六进制数转化为二进制数
hexbinprocnear
xorbx,bx
newchar:
movah,01h
int21h
cmpal,0dh
jzretu;键入回车,结束本组输入
;cmpal,30h
;jlexit;若输入小于30h,不是十六进制的字符
;cmpal,10;与9比较
;jbaddto;此时字符为0~9之间,直接转化为ASCII码来显示即可
SUBAL,30H
JLEXIT
CMPAL,09
JLEADDTO
subal,07;若键入的字符不是0~9,则在判断是否属于大小写a~f
cmpal,0ah
JLexit
cmpal,0fh
JGNEXT
;若输入无误,将输入的数向bx里面存
addto:
movcl,4
shlbx,cl;键入的字符左移四位,移入高位
movah,0
addbx,ax
jmpnewchar
;movah,4ch
NEXT:
subal,20h
cmpal,0ah
jLexit
cmpal,0fh
JLEADDTO
jGexit
jmpretu;retu是什么?
;输入有误时,提示输入错
exit:
crlf
movdx,offsetover
movah,09h
int21h
CRLF
jmpnewchar
retu:
ret;子程序结束
hexbinendp
;将二进制转化为十进制的子程序,通过除十取余来实现
bindecprocnear
movcx,10000
calldiv_d
movcx,1000
calldiv_d
movcx,100
calldiv_d
movcx,10
calldiv_d
movcx,1
calldiv_d
ret
bindecendp
;将数字显示出来
div_dprocnear
;CRLF
movax,bx;被除数的低十六位
movdx,0;被除数的高十六位
divcx
movbx,dx;余数在dx中,然后将其转入bx
addal,30h;商在ax中
movdl,al;把商显示出来
movah,2
int21h
ret
div_dendp
codeends
endstart
3.程序流程图
①、
.
②、
③、
三、实验结果
1.
2.
3.
四、实验总结
本次实验让我对汇编语言有了新的认识,用一种新的眼光去认识汇编语言,也加强了自己对汇编语言的使用能力。
本次实验也遇到了很多困难,通过查资料,相互讨论找到了问题的解答方法。
有很多错误都是细节导致了,这说明我需要让自己更加的细心,认真。
还有些问题是基础知识掌握不牢固,我需要重新多翻看课本。
本学期的实验课程适中,我们实验课程不少但也不太多。
建议课程上老师多演示一些实验例子,谢谢。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验 报告