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

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


 1. 实验任务1

此部分书写内容:

  • 附上源代码文件task1.asm
  • 附上运行结果截图
  • 使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果
  • 分析源代码中data段line4的字节数据的用途

结论

  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

  使用masmlink工具汇编、链接的命令行及运行结果截图:

   使用debug调试:

  修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果:

1 db 5 dup(2)
2 --> 改成:
3 db 2,3,4,5,6

   分析:

  • 循环体实现了字符与颜色的绑定并循环输出至显存区。
  • 修改之后输出字符颜色发生了变化,内容保持不变。分析可知, db 5 dup(2) 表示分配5字节内存空间并初始化为2; db 2,3,4,5,6 表示直接分配5字节内存空间并初始化为2,3,4,5,6.综上分析可知,修改的部分控制了输出字符的颜色,对内容并五影响。

 2. 实验任务2

此部分书写内容:

  • 附上源代码文件task2.asm
  • 附上运行结果截图

结论

  task2.asm源代码:

 1 assume cs:code,ds:data
 2 data segment
 3         db 23,50,66,71,35
 4 data ends
 5 code segment
 6 start:
 7         mov ax,data
 8         mov ds,ax
 9         mov di,0
10         mov cx,5
11 
12 s1:    mov ah,0
13         mov al,ds:[di]
14         mov bl,10
15         div bl
16         mov ds:[10+di],al
17         mov ds:[11+di],ah
18 
19         mov ah,2
20         mov dl,ds:[10+di]
21         add dl,30h
22         int 21h
23 
24         mov ah,2
25         mov dl,ds:[11+di]
26         add dl,30h
27         int 21h
28 
29         mov ah,2
30         mov dl," "
31         int 21h
32     
33         inc di
34         loop s1
35 
36         mov ax,4c00h
37         int 21h
38 code ends
39 end start

   运行结果截图:


3. 实验任务3

此部分书写内容:

  • 附上源代码文件task3.asm
  • 回答教材中①②③三个问题
  • 基于以下实验操作的发现和文字说明
  • 附上回答①时,反汇编查看data段中数据的截图。验证观察到的结果和理论分析是否一致
  • 附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图

结论

  task3程序源码:

 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
  1. CPU执行程序,程序返回前,data段中数据为多少?

    data段数据为:0123h,0456h,0789h,0abch,0defh,0fdeh,0cbah,0987h

  2. CPU执行程序,程序返回前,cs=076c、ss=076b、ds=076a

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

   反汇编调试验证:

 

  debug结果符合预期。


4. 实验任务4

此部分书写内容:

  • 附上源代码文件task4.asm
  • 回答教材中①②③④四个问题
  • 附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图

结论

  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
  1. CPU执行程序,程序返回前,data段中数据为多少?            data段数据为0123h,0456h
  2. CPU执行程序,程序返回前,cs=076c、ss=076b、ds=076a
  3. 设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1
  4. 对于如下定义段:
    name segment
    ...
    name ends
    如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为(N/16+1)*16(因为计算机占据空间必须为16的倍数)

   反汇编调试验证:

    debug结果符合预期。


5. 实验任务5

此部分书写内容:

  • 附上源代码文件task5.asm
  • 回答教材中①②③三个问题
  • 附上回答②时反汇编调试截图,即:在debug中,执行到程序返回前的调试截图

结论

  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
  1. CPU执行程序,程序返回前,data段中数据为多少?            data段数据为0123h,0456h
  2. CPU执行程序,程序返回前,cs=076a、ss=076e、ds=076d
  3. 设程序加载后,code段的段地址为X,则data段的段地址为X+3,stack段的段地址为X+4

   反汇编调试验证:

     debug结果符合预期。


6. 实验任务6

此部分书写内容:

  • 回答教材中提出的问题,并按要求说明原因。

结论

如果将任务三到任务五的“end start”改为“end”,则哪个程序可以正常执行?说出原因?

答:只有任务五的汇编程序可以正常执行。因为任务五程序的代码段定义于数据段和栈段之前,在顺序执行的过程中会首先执行代码段,而不会因执行了数据段和栈段导致程序出现不符合预期的情况。


7. 实验任务7

此部分书写内容:

  • 附上完整源代码文件task7.asm
  • 附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正确实现了题目要求

结论

  task7.asm程序源代码:

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

     反汇编调试验证:

      debug结果符合预期。


 8. 实验任务8

此部分书写内容:

  • 附上完整源代码文件task8.asm
  • 附上在debug环境中,执行到程序返回前,查看逻辑段c的数据的截图,以此验证所编写的程序正 确实现了题目要求。

结论

 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 0,0,0,0,0,0,0,0
 8 b ends
 9 
10 code segment
11 start: 
12        mov ax,a
13        mov ds,ax
14 
15        mov ax,b
16        mov ss,ax
17        mov sp,16
18        mov si,0
19 
20        mov cx,8
21 
22 s:     push ds:[si] 
23        add  si,2
24        loop s
25        mov ax,4c00h
26        int 21h
27 
28 code ends
29 end start

     反汇编调试验证:

       debug结果符合预期。

posted @ 2020-11-20 14:21  max)  阅读(152)  评论(2)    收藏  举报