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

1、实验任务1

任务1-1

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

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

任务1-2

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

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

任务1-3

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

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

任务1-4

① 在debug中将执行到line9结束、line11之前,记录此时:寄存器(DS) = _076C_, 寄存器(SS) = _076E_, 寄存器(CS) = _076A_

② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X+2h_, stack的段地址是 _X+4h_。

任务1-5

基于上述四个实验任务的实践、观察,总结并回答:

① 对于如下定义的段,程序加载后,实际分配给该段的内存空间大小是 __2*[N/16] B_([]为向上取整)__。

② 如果将程序task1_1.asm, task1_2.asm, task1_3.asm, task1_4.asm中,伪指令 end start 改成 end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。

  答:task1_4.asm仍然可以正常运行,由任务1-1可知DS和CS之间的地址默认相差10h,如果没有指出程序的开始位置,程序默认从DS+10h开始运行,将end start改成end,使用-r查看寄存器,可以看到CS的值为076A,而非task1_1.exe中的076C,使用反汇编进行查看,可以发现CS开始的区域全部为0,没有可供执行的指令,其他同理。

 

 2、实验任务2

程序源代码:

 1 assume cs:code
 2 
 3 code segment
 4 start:
 5   mov ax,0b800h
 6   mov ds,ax
 7   mov bx,0f00h
 8   mov cx,50h;50h即80
 9   mov ax,0403h
10 s: mov ds:[bx],ax
11   add bx,2
12   loop s
13 
14   mov ah,4ch
15   int 21h
16 code ends
17 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       ; ten numbers
 8 data2 ends
 9 
10 data3 segment
11     db 16 dup(0)
12 data3 ends
13 
14 code segment
15 start:
16    mov ax,data1
17    mov ds,ax
18    mov bx,0
19    mov cx,0ah
20 s:mov ax,ds:[bx]
21    add ax,ds:[bx+10h]
22    mov ds:[bx+20h],ax
23    inc bx
24    loop s
25 
26    mov ah,4ch
27    int 21h
28 code ends
29 end start

 反汇编:

 相加前:

 相加后:

 

4、实验任务4

 补全后的代码:

 1 assume cs:code,ss:stack
 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(?)
 9 data2 ends
10 
11 stack segment
12     dw 8 dup(?)
13 stack ends
14 
15 code segment
16 start:
17     mov ax,stack
18     mov ss,ax
19     mov sp,8
20     
21     mov ax,data1
22     mov ds,ax
23     mov bx,0
24     mov cx,8
25 s:
26     push [bx]
27     add bx,2
28     loop s
29     
30     mov ax,data2
31     mov ds,ax
32     mov bx,0
33     mov cx,8
34 s2:
35     pop [bx]
36     add bx,2
37     loop s2
38     
39     mov ah, 4ch
40     int 21h
41 code ends
42 end start

 

加载:

 

 

 反汇编:

 

 

 运行结果:

 

 

 5、实验任务5

源码:

 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 
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

运行结果:

 

 

问题:源代码中line19的作用是?

  答: 将小写字母转换成大写字母。

将line 4修改为:db 5 dup(2),运行结果:

 

 

 问题:源代码中data段line4的字节数据的用途是?

  答:line4的作用是设置颜色。

6、实验任务6

源码:

 1 assume cs:code, ds:data, ss:stack
 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 stack segment
11     dw 1 dup(?)
12 stack ends
13 
14 code segment
15 start:
16     mov ax,stack
17     mov ss,ax
18     mov sp,1
19     
20     mov ax,data
21     mov ds,ax
22     
23     mov ax,data
24     mov es,ax
25     mov cx,4
26 s:
27     push cx
28     mov bx,0
29     mov cx,4
30 
31 s2:
32     mov al,es:[bx]
33     or al,20h
34     mov es:[bx],al
35     inc bx
36     loop s2
37     
38     pop cx
39     mov ax,es
40     inc ax
41     mov es,ax
42     
43     loop s
44    
45     mov ah, 4ch
46     int 21h
47 code ends
48 end start

加载:

 

 反汇编:

 

 运行结果:

 

 7、实验任务7

源码:

  1 assume cs:code, ds:data, es:table,ss:stack
  2 
  3 data segment
  4     db '1975', '1976', '1977', '1978', '1979' 
  5     dd  16, 22, 382, 1356, 2390
  6     dw  3, 7, 9, 13, 28 
  7 data ends
  8 
  9 table segment
 10     db 5 dup( 16 dup(' ') )  ;
 11 table ends
 12 
 13 stack segment
 14     dw 1 dup(?)
 15 stack ends
 16 
 17 code segment
 18 start:
 19     mov ax,stack
 20     mov ss,ax
 21     mov sp,1
 22     mov ax,data
 23     mov ds,ax
 24     mov ax,table
 25     mov es,ax
 26     
 27     mov di,0;data
 28     
 29 ;1
 30     mov bx,0;table
 31     mov si,0;table
 32     mov cx,5
 33 year:
 34     push cx
 35     mov cx,4
 36     
 37 year2:
 38     mov al,ds:[di]
 39     mov es:[bx+si],al
 40     inc si
 41     inc di
 42     loop year2
 43     
 44     pop cx
 45     add bx,10h
 46     mov si,0
 47     loop year
 48     
 49 ;2
 50     mov bx,0
 51     mov si,5
 52     mov cx,5
 53 income:
 54     push cx
 55     mov cx,4
 56     
 57 income2:
 58     mov al,ds:[di]
 59     mov es:[bx+si],al
 60     inc si
 61     inc di
 62     loop income2
 63     
 64     pop cx
 65     add bx,10h
 66     mov si,5
 67     loop income
 68     
 69 ;3
 70     mov bx,0
 71     mov si,10
 72     mov cx,5
 73 num:
 74     push cx
 75     mov cx,2
 76     
 77 num2:
 78     mov al,ds:[di]
 79     mov es:[bx+si],al
 80     inc si
 81     inc di
 82     loop num2
 83     
 84     pop cx
 85     add bx,10h
 86     mov si,10
 87     loop num
 88 
 89 ;4
 90     mov bx,0
 91     mov si,5
 92     mov cx,5
 93 cal:
 94     mov ax,word ptr es:[bx+si]
 95     add si,2
 96     mov dx,word ptr es:[bx+si]
 97     add si,3
 98     div word ptr es:[bx+si]
 99     add si,3
100     mov word ptr es:[bx+si],ax
101     
102     add bx,10h
103     mov si,5
104     loop cal
105     
106     mov ah, 4ch
107     int 21h
108 code ends
109 end start

运行结果:

 

 结构化写入后:

 

posted @ 2021-11-08 14:56  吹吹哭哭惹  阅读(59)  评论(3编辑  收藏  举报