首页 > 其他 > 详细

实验3 多个段的汇编源程序编写与调试

时间:2020-11-26 13:33:16      阅读:39      评论:0      收藏:0      [点我收藏+]

1. 实验任务1

使用任意文本编辑器,录入汇编源程序task1.asm。源代码如下:

 1 assume cs:code, ds:data 
 2 data segment 
 3     db Nuist 
 4     db 5 dup(2) 
 5 data ends 
 6 
 7 code segment 
 8 start: 
 9     mov ax, data 
10     mov ds, ax 
11 
12     mov ax, 0b800H 
13     mov es, ax 
14 
15     mov cx, 5 
16     mov si, 0 
17     mov di, 0f00h 
18 s:  mov al, [si] 
19     and al, 0dfh 
20     mov es:[di], al 
21     mov al, [5+si] 
22     mov es:[di+1], al 
23     inc si 
24     add di, 2 
25     loop s 
26 
27     mov ah, 4ch 
28     int 21h 
29 code ends 
30 end start

使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。

  从以下的截图中可以观察到,实验结果为绿色的NUSIT字样。
技术分享图片

在debug里调试到程序返回前,即line27之前

  使用u命令将偏移地址为0~2ah范围内的代码进行反汇编,找到CS:IP对应的指令为line27对应的 mov ah, 4ch处,然后使用g命令调试。

技术分享图片

技术分享图片

修改line4里5个字节单元的值

1 db 5 dup(2)
2  --> 改成: 
3 db 2,3,4,5,6
  重新汇编、链接、运行,得到如下所示的结果,“UIST”的颜色均发生变化,“N”仍为绿色。

技术分享图片

分析源代码中data段line4的字节数据的用途是?

  根据修改前后呈现结果的对比,第二次有四个字符颜色有所改变,故line4的字节数据应是用以控制字符颜色的。

 

 

2. 实验任务2

已知数据段data中定义字节数据如下:

1 data segments 
2     db 23, 50, 66, 71, 35 
3 data ends

编写程序,在屏幕上以十进制整数形式打印输出这5个两位数。

  结合提示,编写程序如下:

 1 assume cs:code, ds:data
 2 data segment
 3         db 23, 50, 66, 71, 35
 4 data ends
 5 
 6 code segment
 7 start:
 8         mov ax, data
 9         mov ds, ax
10         mov cx, 5
11         mov si, 0
12 
13 s:      mov ah,0;
14         mov al, [si];
15         mov bl, 10;
16         div bl; //利用除法指令div,计算出每个数位上的数值
17 
18         mov dx, ax;
19         add dx, 3030h; //利用数值和数字字符之间ascⅡ码的关系,把数值→数字字符
20 
21         mov ah,2;
22         int 21h; //利用系统功能调用int 21h中的2号子功能,输出单个字符
23         mov ah,2;
24         mov dl,dh;
25         int 21h;
26 
27         mov dl, 
28         int 21h
29 
30         inc si;
31         loop s;
32 
33         mov ah, 4ch
34         int 21h
35 code ends
36 end start

  运行结果如下,指定的5个两位数均成功打印输出到屏幕上。

技术分享图片

 

 

3. 实验任务3

 将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。

(1)附上源代码文件task3.asm

 1 assume cs:code, ds:data, ss:stack
 2 data segment
 3   dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
 4 data ends
 5 
 6 stack segment
 7   dw 0, 0, 0, 0, 0, 0, 0, 0
 8 stack ends
 9 
10 code segment
11 start:  mov ax,stack
12         mov ss, ax
13         mov sp,16
14         
15         mov ax, data
16         mov ds, ax
17         
18         push ds:[0]
19         push ds:[2]
20         pop ds:[2]
21         pop ds:[0]
22         
23         mov ax,4c00h
24         int 21h
25 
26 code ends
27 end start

(2)回答教材中①②③三个问题。

  ①?CPU执行程序,程序返回前,data段中的数据为

   data段中的数据仍为0123h 0456h 0789h 0abch 0defh 0fedh 0cbah 0987h 。      ?

  ②?CPU执行程序,程序返回前,cs=076CH、ss=076BH、ds=076AH。?

  ③?设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1

(3)附上回答①时,反汇编查看data段中数据的截图。验证观察到的结果和理论分析是否一致。

    使用d命令查看data段中的数据,证实实验结果与理论分析一致。

技术分享图片

(4)附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。

技术分享图片

 

 

4. 实验任务4

 将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。

(1)附上源代码文件task4.asm

 1 assume cs:code, ds:data, ss:stack
 2 data segment
 3   dw 0123h, 0456h
 4 data ends
 5 
 6 stack segment
 7   dw 0, 0
 8 stack ends
 9 
10 code segment
11 start:  mov ax,stack
12         mov ss, ax
13         mov sp,16
14         
15         mov ax, data
16         mov ds, ax
17         
18         push ds:[0]
19         push ds:[2]
20         pop ds:[2]
21         pop ds:[0]
22         
23         mov ax,4c00h
24         int 21h
25 
26 code ends
27 end start

(2)回答教材中①②③④三个问题。

  ①?CPU执行程序,程序返回前,data段中的数据为多少??

  data段中的数据仍为0123h 0456h

  ②?CPU执行程序,程序返回前,cs = 076CH、 ss = 076BH、ds = 076AH

  ③?设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1

  ④对于如下定义的段:?

  name?segment

  …

  name?ends?

 如果段中的数据占N个字节,则程序加载后,这段实际占有的空间为(N/16+1)*16。(N/16向下取整)

8086处理器的内部寻址原理和汇编程序编译器共同决定了segment定义的段必须放在按16的倍数对准的段地址边界上,占用的空间也是16的倍数.

此处有更为详尽的解释可供参考

(3)附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。

技术分享图片

 

 

5. 实验任务5

 将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。

(1)附上源代码文件task5.asm

 1 assume cs:code, ds:data, ss:stack
 2 
 3 code segment
 4 start:  mov ax,stack
 5         mov ss, ax
 6         mov sp,16
 7         
 8         mov ax, data
 9         mov ds, ax
10         
11         push ds:[0]
12         push ds:[2]
13         pop ds:[2]
14         pop ds:[0]
15         
16         mov ax,4c00h
17         int 21h
18 
19 code ends
20 data segment
21   dw 0123h, 0456h
22 data ends
23 
24 stack segment
25   dw 0,0
26 stack ends
27 end start

(2)回答教材中①②③三个问题。

  ①?CPU执行程序,程序返回前,data段中的数据为多少??

  data段中的数据仍为0123H,0456H

  ②?CPU执行程序,程序返回前, cs = 076AH、ss = 076EH、ds = 076DH

  ③?设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4。?

(3)附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图。

技术分享图片

 

 

6. 实验任务6

如果将(1)、(2)、(3)题中的最后一条伪指令“end?start”改为“end(也就是说不指明程序的入口),则那个程序仍然可以正确执行?请说明原因。

技术分享图片

技术分享图片

技术分享图片

  以上三图的反汇编结果与前三个实验任务中的截图作对比,可证明(1)、(2)不能正常执行,(3)仍然可以被正确执行。因为不指明程序的入口时,入口则默认为加载进内存的第一个单元。在(1)、(2)中,皆是数据先加载进内存,而(3)是代码段先加载进内存。

 

7. 实验任务7

程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。

(1)附上源代码文件task7.asm

 1 assume cs:code
 2 a segment
 3   db 1,2,3,4,5,6,7,8
 4 a ends
 5 
 6 b segment
 7   db 1,2,3,4,5,6,7,8
 8 b ends
 9 
10 c segment   
11   db 8 dup(0)
12 c ends
13 
14 code segment
15 start:
16     mov ax,c       
17     mov ds,ax       
18     mov cx,8       
19     mov bx,0       
20     mov ax,a       
21     mov es,ax       
22     mov ax,b       
23     mov ss,ax    
24 s:     mov al,es:[bx]       
25     add al,ss:[bx]       
26     mov [bx],al       
27     inc bx       
28     loop s 
29 
30     mov ax,4c00h       
31     int 21h
32 
33 code ends
34 end start

(2)附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求

  使用u命令反汇编查看,g命令执行到程序返回前。

技术分享图片

技术分享图片  

  d命令查看逻辑段c中的数据,经检验得证成功。

技术分享图片

 

 

8. 实验任务8

程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。

(1)附上源代码文件task8.asm

 1 assume cs:code
 2 a segment
 3   dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
 4 a ends
 5 
 6 b segment
 7   dw 8 dup(0)
 8 b ends
 9 
10 code segment
11 start:    
12     mov ax,a
13     mov ds,ax
14       mov ax,b
15       mov ss,ax
16       mov sp,16
17       mov cx,8
18       mov bx,0
19  s:    mov ax,[bx]
20       push ax
21       add bx,2
22       loop s
23   
24       mov ax,4c00h
25     int 21h
26 code ends
27 end start

(2)附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求

  使用u命令反汇编查看,g命令执行到程序返回前。

技术分享图片

   d命令查看逻辑段c中的数据,经检验得证成功。技术分享图片

 

 

 

实验3 多个段的汇编源程序编写与调试

原文:https://www.cnblogs.com/jewnicorner/p/14039456.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!