练习1:
输入代码:
1 assume cs:code 2 code segment 3 mov ah,2 4 mov dl,3 5 add dl,30h 6 int 21h 7 8 mov ah,2 9 mov dl,6 10 add dl,30h 11 int 21h 12 13 mov ah,4ch 14 int 21h 15 code ends 16 end
效果图:
在DOS虚拟环境下用edit新建文本kk.asm代码如下:
可以在用type + 文件名查看代码:
对kk.asm进行汇编:
第一种方法:进入masm后,再输入文件名。
第二种方法:直接masm + 文件名
连接:同样是两种,同上,不再赘述(只需选一种即可)
运行:
修改:将 line4和line9种寄存器dl 的值分别修改7,9
再次汇编、连接、运行:
得到结果79,将第四行dl修改后7H再加30H等于37H,显示在屏幕上为7
同理,将第九行dl改为9H再加30H等于39H,显示在屏幕上为9
用debug进行调试:
用U指令反汇编一下:
再用T/P指令单步执行:
遇到int 21时,需用P去执行而不是T,否则显示不出数字。
说明:t命令和p命令的区别
单步执行程序时,如果遇到子程序或中断服务程序:
若使用t命令,则进入子程序或中断服务程序,继续单步执行;
若使用p命令,则把子程序或中断服务程序当做是一个整体执行。
上面仔细看每一步都可以发现:
CS=DS+10H
PSP(程序段前缀)的两个头字节是:
PSP是内存去的前256个字节(10H),DOS用这段内存进行通信。该字节后是存放程序的空间。
练习2:
输入代码:
1 assume cs:code 2 code segment 3 mov ax,0b800H 4 mov ds,ax 5 6 mov bx,0 7 mov [bx],0433H 8 9 add bx,2 10 mov [bx],0436H 11 12 mov ax,4C00H 13 int 21H 14 code ends 15 end
输入该程序:
运行结果:
没有预期的红色36
清屏(cls)再次运行:
修改line7的0433h→0432h, line10 的 0436h→0439h,
然后重新汇编、连接,清屏运行:
变成了:
红色的29
再次修改结果:
line7的0433h→0333h, line10 的 0436h→0336h
后重新汇编、连接,清屏,执行t2.exe
得到了蓝绿色的36
联系实验1,任务四:
都是往B8100H内存中写入数据。
其中,B8100H内存中分配给显示区的虚拟内存区。
向地址A0000~BFFFF的内存单元中写数据,就是向显存中写入数据,
这些数据会被显示卡输出到显示器上。
本实验的练习2等价于在debug中
-e B810:0 33 04 36 04 -e B810:0 32 04 39 04 -e B810:0 33 03 36 03
(老是打错字符,所以退出清屏,直接用-e写入了第三)
实验1-4写入,效果和本实验的练习2效果相同!
位置是前面B8100控制的,改成B800同样会出现在第一个位置。
大家可以自己实验一下。在实验1-4,大家应该修改过。
猜测:
应该是ds=B810,B810表示字符出现的位置
[0]=33表示字符3,[1]=03表示颜色
同理,[2]表示字符,[3]表示颜色。
[x-1]当x为奇数时,写入该内存单元的16H ACSII码表示的字符。
[x-1]当x为偶数时,是字符的颜色。
由于时间原因,我就不继续搞下去了。
有兴趣的小伙伴可以继续哟!
记得写完了@我一下。
实验总结与感受:
第一感到写实验报告的快乐,同时花费大量的时间。
当然基本的汇编法则早在反复输入中,深刻地刻在脑海。此处不再赘述。
我一直不建议死记,在实践的时候,用到它,就自然记住了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现