博客园
虽然痛苦,却依旧要快乐,并相信着未来。

导航

 

练习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为偶数时,是字符的颜色。

由于时间原因,我就不继续搞下去了。

有兴趣的小伙伴可以继续哟!

记得写完了@我一下。

实验总结与感受:

  第一感到写实验报告的快乐,同时花费大量的时间。

  当然基本的汇编法则早在反复输入中,深刻地刻在脑海。此处不再赘述。

  我一直不建议死记,在实践的时候,用到它,就自然记住了。

posted on 2018-11-15 21:36  砖猿  阅读(210)  评论(1编辑  收藏  举报