多个逻辑段的汇编源程序编写与调试

多个逻辑段的汇编源程序编写与调试

1. 实验任务1

  • 任务1-1 

    • task1_1.asm源码:
    •  1 assume ds:data,cs:code,ss:stack
       2 
       3 data segment
       4     db 16 dup(0)
       5 data ends
       6 
       7 stack segment
       8     db 16 dup(0)
       9 stack ends
      10 
      11 code segment
      12 start:
      13     mov ax,data
      14     mov ds,ax
      15     mov ax,stack
      16     mov ss,ax
      17     mov sp,16
      18     
      19     mov ah,4ch
      20     int 21h
      21 code ends
      22 end start
    • task1_1调试到line17结束、line19之前截图

      

    • 问题回答:

      ① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =  076A      , 寄存器(SS)=   076B        , 寄存器(CS) =    076C   

      ② 假设程序加载后,code段的段地址是X,则,data段的段地址是  X-2     , stack的段地址是 X-1     

  • 任务1-2

    • 任务task1_2.asm源码
    •  1 assume ds:data,cs:code,ss:stack
       2 data segment
       3     db 8 dup(0)
       4 data ends
       5 
       6 stack segment
       7     db 8 dup(0)
       8 stack ends
       9 code segment
      10 start:
      11     mov ax,data
      12     mov ds,ax
      13     
      14     mov ax,stack
      15     mov ss,ax
      16     mov sp,8
      17     
      18     mov ah,4ch
      19     int 21h
      20 code ends
      21 end start
    • task1_2调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

      

    • 问题回答
      ① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =  076A        , 寄存器(SS)=  076B       
        寄存器(CS) =   076C      
      ② 假设程序加载后,code段的段地址是X,则,data段的段地址是  X-2       , stack的段地址是   X-1       
  • 任务1-3

    • 任务task1_3.asm源码
    •  1 assume ds:data,cs:code,ss:stack
       2 
       3 data segment
       4     db 20 dup(0)
       5 data ends
       6 stack segment
       7     db 20 dup(0)
       8 stack ends
       9 code segment
      10 start:
      11     mov ax,data
      12     mov ds,ax
      13     
      14     mov ax,stack
      15     mov ss,ax
      16     mov sp,20
      17     
      18     mov ah,4ch
      19     int 21h
      20 code ends
      21 end start    
    • task1_3调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

       

    • 问题回答
     ① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) =    076A       , 寄存器(SS)=   076C      
       寄存器(CS) = 076E       
     ② 假设程序加载后,code段的段地址是X,则,data段的段地址是  X-4      , stack的段地址是  X-2     
 
  • 任务1-4

    • 任务task1_4.asm源码
    •  1 assume ds:data,cs:code,ss:stack
       2 code segment
       3 start:
       4     mov ax,data
       5     mov ds,ax
       6     
       7     mov ax,stack
       8     mov ss,ax
       9     mov sp,20
      10     
      11     mov ah,4ch
      12     int 21h
      13 code ends
      14 
      15 data segment
      16     db 20 dup(0)
      17 data ends
      18 
      19 stack segment
      20     db 20 dup(0)
      21 stack ends
      22 end start   
    • 任务task1_4.asm源码task1_4调试到line17结束、line19之前观察寄存器DS, CS, SS值的截图

      

    • 问题回答:
      ① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) =    076C      , 寄存器(SS) =  076E       
        寄存器(CS) = 076A       
      
      ② 假设程序加载后,code段的段地址是X,则,data段的段地址是  X+2        , stack的段地址是   X+4     
 
  • 任务1-5 

  基于上述四个实验任务的实践、观察,总结并回答:
  ① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是       (N/16+1)*16        。 
1 XXX segment
2     dp N dup(0)
3 XXX ends

  ② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成

  end , 哪一个程序仍然可以正确执行。结合实践观察得到的结论,分析、说明原因。 
     ask1_4.asm仍然可以正确执行。定义的段在不同的位置,有不同的效果。
  如代码段定义在最开始,即使不写start:入口程序也可以执行,但如果代码段不在最开始,则必须写上start,
  告诉dos程序的执行开始位置。

2. 实验任务2  

  编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数
  据03 04。 
  • 汇编源代码
assume cs:code
code segment
start:
    mov ax,0b800h
    mov ds,ax
    
    mov bx,0f00h
    mov cx,80
    
s:    mov ds:[bx],0403h
    inc bx
    inc bx
    loop s
    
    mov ah,4ch
    int 21h
code ends
end start
  • 运行结果截图 
   

 

 

3. 实验任务3 

 源代码:
 1 assume cs:code
 2 data1 segment
 3     db 50,48,50,50,0,48,49,0,48,49    ;ten numbers
 4 data1 ends
 5 
 6 data2 segment
 7     db 0,0,0,0,47,0,0,47,0,0    
 8 data2 ends
 9 
10 data3 segment
11     db 16 dup(0)
12 data3 ends
13 
14 code segment
15 start:
16     mov cx,10    ;循环次数
17     mov dx,0    ;求和寄存器
18     mov bx,0    ;偏移地址
19     
20 s:    
21     mov dx,0
22     
23     mov ax,data1
24     mov ds,ax
25     mov dl,[bx]
26     
27     mov ax,data2
28     mov ds,ax
29     add dl,[bx]
30     
31     mov ax,data3
32     mov ds,ax
33     mov [bx],dl
34     
35     inc bx
36     loop s
37     
38     mov ah,4ch
39     int 21h
40 code ends
41 end start

 

在debug中加载、反汇编、调试截图(要求给出,在数据项依次相加之前,查看逻辑段data1, data2, data3
对应的内存空间数据原始值的debug命令和截图。以及,依次相加之后,查看逻辑段data1, data2, data3对应的
内存空间数据原始值的debug命令和截图):
 
 
 
相加之后的截图:
 

4. 实验任务4

补充完整后的汇编源代码
 1 assume cs:code
 2 
 3 data1 segment
 4     dw 2,0,4,9,2,0,1,9    
 5 data1 ends
 6 
 7 data2 segment
 8     dw 8 dup(0)
 9 data2 ends
10 
11 code segment
12 start:
13     mov ax,data1
14     mov ds,ax
15     mov ax,data2
16     mov ss,ax
17     mov sp,10h
18     
19     mov bx,0
20     mov cx,8
21     
22 s:    push [bx]
23     add bx,2
24     loop s
25     
26     mov ah,4ch
27     int 21h
28 code ends
29 end start
 
在debug中加载、反汇编、调试截图(要求给出,在程序退出前,使用d命令查看数据段data2对应的内存空间的截图。):
 

5. 实验任务5

task5.asm源码:
 1 assume cs:code,ds:data
 2 data segment
 3     db 'Nuist'
 4     db 2,3,4,5,6
 5 data ends
 6 
 7 code segment
 8 start:
 9     mov ax,data
10     mov ds,ax
11     mov ax,0b800h
12     mov es,ax
13     
14     mov cx,5
15     mov si,0
16     mov di,0f00h
17 s:    mov al,[si]
18     and al,0dfh
19     mov es:[di],al
20     mov al,[5+si]
21     mov es:[di+1],al
22     inc si
23     add di,2
24     loop s
25     
26     mov ah,4ch
27     int 21h
28 code ends
29 end start
运行结果截图:
 
使用debug工具对程序进行调试,使用g命令一次性执行到程序返回前(即ine25执行之后、line27执行之前)的截图:
   
  1.源代码中line19的作用是:将al的第五位置为0,变为大写字母
  2.源代码中data段line4的字节数据的用途是:改变字符串NUIST的颜色

6. 实验任务6

task6.asm源代码:
 1 assume cs:code, ds:data
 2 
 3 data segment
 4     db 'Pink Floyd      '
 5     db 'JOAN Baez       '
 6     db 'NEIL Young      '
 7     db 'Joan Lennon     '
 8 data ends
 9 
10 code segment
11 start:
12     mov ax,data
13     mov ds,ax
14     mov cx,4
15     mov bx,0
16 s:  
17     mov dx,cx
18     mov cx,4
19     mov si,0
20         s0:
21             mov al,ds:[bx+si]
22             or al,00100000B
23             mov ds:[bx+si],al
24             inc si
25             loop s0
26     add bx,16
27     mov cx,dx
28     loop s
29 
30     mov ah, 4ch
31     int 21h
32 code ends
33 end start
在debug中加载、反汇编、调试截图:(要求给出,在程序退出前,使用d命令查看数据段data对应的内存空间的截图。)
 

7. 实验任务7

task7.asm源码:
 2 assume cs:code,ds:data,es:table
 3 
 4 data segment    
 5     db '1975','1976','1977','1978','1979'    ;字符串 4*5 = 20(内存单元数)
 6     dw 16,22,382,1356,2390                ;总收入的数据 2*5 = 10
 7     dw 3,7,9,13,28                        ;雇员人数的5个word型数据 2*5=10    
 8 data ends
 9 
10 table segment
11     db 5 dup(16 dup(' '))             ;刚好16个字节
12 table ends
13 
14 code segment
15 start:
16     ;data数据 放在ds
17     mov ax,data
18     mov ds,ax
19     mov ax,table
20     mov es,ax
21     
22     mov bx,0 
23     mov si,0     
24     mov di,0         
25     mov cx,5
26     
27     add di,20
28     
29 s:    mov ax,[bx]
30     mov es:[si],ax
31     mov ax,[bx+2]
32     mov es:[si+2],ax
33 
34     mov ax,[di]
35     mov es:[si+5],ax
36 
37     mov ax,[di+10]
38     mov es:[si+10],ax
39         
40     mov ax,[di]
41     mov dl,[di+10]
42     div dl
43     mov es:[si+13],al
44 
45     add si,16
46     add di,2
47     add bx,4
48     loop s
49 
50     mov ax,4c00h
51     int 21h
52 code ends
53 end start
调试截图:
 
查看table段原始数据信息截图:
 
在debug中运行到程序退出之前,使用d命令查看table段对应的内存空间的截图,确认信息是否
按要求结构化地写入到指定内存:
 

 

 

 实验总结

1、push指令只进行字操作。

2、div指令需要注意除数与被除数的位数,特别的被除数位数过大问题。

 
posted @ 2021-11-07 22:10  小小神龙  阅读(90)  评论(2)    收藏  举报