centurion829

导航

第二次实验

1. 实验任务1

ex1.asm的源代码:

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

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

 

 

 debug调试:

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

 

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

 

 

 

 

2. 实验任务2

ex2.asm的源代码:

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

  

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

 

 

 运行结果:

debug调试:

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

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

 

 

 

 

 

 实验分析:

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

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

 

3. 实验任务3

ex3.asm的源代码:

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

  

运行结果截图:

 

 

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

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

 

 

 实验分析:

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

 

4. 实验任务4

ex4.asm的源代码如下:

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

  

debug调试:

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

  

 

5. 实验任务5

ex5.asm的源代码如下:

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

  

 debug调试结果如下:

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

posted on 2020-11-06 10:20  centurion829  阅读(62)  评论(2编辑  收藏  举报