ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

实验2 汇编源程序编写与汇编、调试

2020-11-05 12:34:02  阅读:204  来源: 互联网

标签:显存 汇编 code mov 源程序 ax bx ds 调试


一、实验任务

1. 实验任务1

ex1.asm的源代码:

 1 ;ex1.asm
 2 assume cs:code
 3 code segment
 4 mov ax, 0b810h
 5 mov ds, ax
 6 
 7 mov byte ptr ds:[0], 1
 8 mov byte ptr ds:[1], 1
 9 mov byte ptr ds:[2], 2
10 mov byte ptr ds:[3], 2
11 mov byte ptr ds:[4], 3
12 mov byte ptr ds:[5], 3
13 mov byte ptr ds:[6], 4
14 mov byte ptr ds:[7], 4
15 
16 mov ah, 4ch
17 int 21h
18 code ends
19 end

 

使用masm、link工具汇编、链接:

 

 

 debug调试:

观察到cx=31,使用u命令精准反汇编至30;

 

使用g命令执行至倒数第二行,此时命令行出现图像

   

 

 

 

2. 实验任务2

ex2.asm的源代码:

 1 ;ex2.asm
 2 assume cs:code
 3 code segment
 4 mov ax, 0b810h
 5 mov ds, ax
 6 
 7 mov bx, 0
 8 mov ax, 101H
 9 mov cx, 4
10 s:    mov [bx], ax
11 add bx, 2
12 add ax, 101H
13 loop s
14 
15 mov ah, 4ch
16 int 21h
17 code ends
18 end

 使用masm、link工具汇编、链接:

 

 

 运行结果:

 

 

 debug调试:

观察到cx=1c,使用u命令精准反汇编至1b;

使用g命令执行至倒数第二行,此时命令行出现图像:

 

 

 

 

 

 实验分析:

该程序的作用与ex1.exe相同,都是对显存的指定位置写入特定的内容,使得屏幕上显示四个颜色形状各异的图标。

在具体实现上,ex1.exe通过代码的重复来更改显存地址,而ex2.exe则利用了loop语句简化了这一过程。

3. 实验任务3

ex3.asm的源代码:

 1 assume cs:code
 2 code segment
 3 mov ax,0b800h
 4 mov ds,ax
 5 mov ax,0237h
 6 mov bx,07b8h
 7 
 8 mov cx,16
 9 s: mov ds:[bx],ax
10 add bx,2h
11 loop s
12 
13 mov ax,4c00h
14 int 21h
15 code ends
16 end

运行结果截图:

 

 

把填充的字数据,从0237H 改成0239H后,观察结果:

把填充的字数据,从0237H 改成0437H后,观察结果:

 

 

 实验分析:

这个字数据中高位字节里存放的是图标的颜色,低位字节里存放的图标的内容。

4. 实验任务4

ex4.asm的源代码如下:

 1 assume cs:code
 2 code segment
 3 mov ax,0
 4 mov ds,ax
 5 mov ax,0200h
 6 mov bx,ax
 7 
 8 mov ax,0
 9 mov cx,03fh 
10 s: mov ds:[bx],ax
11 add ax,1
12 add bx,1
13 loop s
14 
15 mov ax,4c00h
16 int 21h
17 code ends
18 end

 debug调试:

成功将0~63写入内存0:200~0:23f。

  

 

 

 5. 实验任务5

ex5.asm的源代码如下:

 1 assume cs:code
 2 code segment
 3 mov ax ,cs
 4 mov ds,ax
 5 mov ax,002h
 6 mov es,ax
 7 mov bx,0
 8 mov cx,cx
 9 
10 s: mov al,ds:[bx]
11 mov es:[bx],al
12 inc bx
13 loop s
14 
15 mov ax,4c00h
16 int 21h
17 code ends
18 end

 debug调试结果如下:

可以看见已经成功把程序本身复制至0:200内存单元处。

 二、实验总结

  在实验过程中,对于实验1和实验2的调试过程中,发现了一个问题:对于显存的读写,有时候是成功的,而有时候是失败的。经过多次实验,可以总结出一个结论,当运行读写显存指令时,如果控制台的页面已经被语句铺满,因为新代码的显示,产生了页面的滚动,则无法正确读写显存;若控制台内容为空,新代码的显示不导致页面滚动,则可以读写显存显示图标。

  经过分析,我认为是控制台语句滚动这一事实发生在读写显存语句之后,同时控制台为了滚动页面,会将下面行的内容写入滚上去的一行,这次写入会覆盖之前的语句读写现存,导致读写显存语句虽然生效,但是无法显示出结果。

标签:显存,汇编,code,mov,源程序,ax,bx,ds,调试
来源: https://www.cnblogs.com/Lvatsit/p/13931019.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有