📋 作者介绍:友友们好我是乱披风锤,大二学生党一枚
💖作者主页:乱披风锤的个人博客主页.跳转到个人简介
🔥 我和友友们一样喜欢编辑,天天敲代码🤭,沉迷学习,日渐消瘦。很荣幸能向大家分享我的所学,和大家一起进步。如果文章有错误,欢迎在评论区指正。那么开始今天的学习吧!
🎉 支持我:点赞👍+收藏⭐️+留言📝
一、实验目的
学会汇编语言程序的编译链接执行。
学会使用debug分步调试程序。
掌握代码段定义相关伪操作。
二、实验要求
请用绿色或者蓝色字体作答。
源程序直接粘贴文字,源程序不要截图。
三、实验过程和结果
请用绿色或者蓝色字体作答。
源程序直接粘贴文字,源程序不要截图。
1.将汇编语言编译环境(masm文件夹)复制粘贴至c或者d根目录下(这个步骤在前几个实验中就已经完成)。
2.将上图汇编语言程序输入至记事本中(分号后面的是注释,可以不敲入),并且另存为“文件名.asm”的形式。文件命名请以字母或者下划线开头,不要使用中文。例如“myfile.asm”。请注意输入的时候符号是全角还是半角状态。
3.进入dosbox,mount命令使用完成后,进入masm文件夹。如果电脑够低端,也可以直接进入masm文件夹,而不使用dosbox。
4.编译链接执行汇编语言程序。从键盘输入某个字母,如下图中输入了q
你的截图
思考:上图中qqa是怎么回事(不一定是q,你也可以输入其他字符),请猜测这个程序干了什么事情(参阅系统功能调用int 21h)。
答:从键盘输入单个字符后,输出与键盘输入的字符相同的字符,然后输出大写的字母A(大写字母A的ASCII码对应的十六进制是41)比如输如q,输出qqA
思考:写一条本程序中的伪指令
答:end , assume, segment和ends
思考:本程序中有标签吗?如果有,请写出
答:有,code
思考:本程序中ends有什么含义
答:段的结束
思考:本程序中返回dos的两条指令有什么用?请删除这两条指令重新运行试试。
答:用它返回是不需任何条件,还可顺便关闭打开后忘记关闭的文件。并返回寄存器al的值。在DOS中可用于*.com或*.exe文件。
5.Debug生成的exe程序,并逐条执行。注意使用t和p命令。直到程序运行结束,用q命令退出debug。
你的截图
思考:本程序并没有使用cx寄存器,可是cx=0015h这是随机数还是有什么含意?可再次debug逐条执行,看看cx是不是不同。
CX中存放的是程序的长度,程序的机器码共有15个字节
6.尝试修改源程序,完成你想要的功能,并另存为另外的名字(能用中文名吗)。
新源程序粘贴如下(不要截图):
答:code segment
;求解2的5次方
assume cs:code
start:
mov ax,2
add ax,ax
add ax,ax
add ax,ax
add ax,ax
mov ax,4c00h
int 21h
code ends
end start
7.重新编译链接执行新源程序,看看能不能得到你想要的结果(程序中适当的注释是不是很有用呢?)。
截图:
8.debug你的新程序生成的可执行文件,并逐条执行。注意查看刚刚加载时cx的值。
思考:初始状态cx寄存器的值是多少?跟之前的程序一样吗?
答:不一样,因为修改后的源程序的代码长度变了,CX表示程序中代码的长度
9.请自己尝试编写求23的汇编程序,运行结果保存在AX寄存器中。编译、链接、执行后,debug所生成的可执行文件,再用u命令查看代码,用t命令单步执行后查看结果(如果遇到int 21h 请用p命令执行)。填写代码段的范围。
源程序(不要截图):
答:code segment
;求解222
assume cs:code
start:
mov ax,2
add ax,ax
add ax,ax
mov ax,4c00h
int 21h
code ends
end start
debug可执行文件,查看初始状态,截图:
debug可执行文件,查看代码段,截图:
psp起止地址:
答:075A
代码段起止地址:
答:076A:0000 076A:000C
总结
好了,那么今天的学习就到这里了。友友们觉得不错的可以给个关注,点赞或者收藏哦!感谢各位友友们的支持。以下的代码希望各位大佬们自行检验哦,毕竟亲手操作让记忆更加深刻。