练习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为偶数时,是字符的颜色。
由于时间原因,我就不继续搞下去了。
有兴趣的小伙伴可以继续哟!
记得写完了@我一下。
实验总结与感受:
第一感到写实验报告的快乐,同时花费大量的时间。
当然基本的汇编法则早在反复输入中,深刻地刻在脑海。此处不再赘述。
我一直不建议死记,在实践的时候,用到它,就自然记住了。