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

实验任务1
任务1-1
对程序task1_1.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

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

__076B__, 寄存器(CS) = __076C__
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2_, stack的段地址是_X-1_。
 
任务1-2
对程序task1_2.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。
① 在debug中将执行到line17结束、line19之前,记录此时:寄存器(DS) = _076A_, 寄存器(SS) =
__076B__, 寄存器(CS) = _076C_
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-2_, stack的段地址是_X-1。
任务1-3
对程序task1_3.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

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

_076C_, 寄存器(CS) = _076E_
② 假设程序加载后,code段的段地址是X,则,data段的段地址是_X-4_, stack的段地址是_X-2_。
任务1-4
对程序task1_4.asm进行汇编、连接,用debug加载、跟踪调试,基于结果,回答问题。

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

_076E_, 寄存器(CS) = _076A_
② 假设程序加载后,code段的段地址是X,则,data段的段地址是__X+2__, stack的段地址是
_X+4_。
任务1-5
xxx segment 
    db N dup(0) 
xxx ends
基于上述四个实验任务的实践、观察,总结并回答:
① 对于如上定义的段,程序加载后,实际分配给该段的内存空间大小是 ____。
答:如果N16的倍数 内存空间大小为N字节

否则,内存空间大小为((N%16)+1)*16个字节

 

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

 

end , 哪一个程序仍然可以正确执行?结合实践观察得到的结论,分析、说明原因。

答:将伪指令修改为end后,task1_4.asm可以正常运行,而task1_1.asmtask1_2.asmtask1_3.asm都无法正常运行。如果不写start,程序将默认数据段的首地址为程序的初始地址,而因为task1_4.asm中代码段写在最前面,所以不会产生影响。

实验任务2

编写一个汇编源程序,实现向内存单元b800:0f00 ~ b800:0f9f连续160字节,依次重复填充十六进制数
据03 04。
代码如下:
 1 assume cs:code
 2 code segment
 3 start:
 4     mov ax,0b800h
 5     mov ds,ax
 6     mov bx,0f00h
 7     mov dx,0403h
 8     mov cx,80
 9  
10 s:  mov ds:[bx],dx
11     inc bx
12     inc bx
13     loop s
14     mov ah,4ch
15     int 21h
16  
17 code ends
18  
19 end start

运行结果:

实验任务三:

① 编程实现把逻辑段data1和逻辑段data2的数据依次相加,结果保存到逻辑段data3中。
② 在debug中加载、反汇编、调试。在数据项依次相加前,和相加后,分别查看三个逻辑段data1,
data2, data3对应的内存空间,确认逐一相加后,结果的确保存在了逻辑段data3中。
代码如下:
 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 ax,data2
19     mov es,ax
20     mov ax,data3
21     mov ss,ax
22     mov bx,0
23     mov cx,10
24 s:     mov ax,ds:[bx]
25     add ax,es:[bx]
26     mov ss:[bx],ax
27     inc bx
28     loop s
29     
30     mov ah,4ch
31     int 21h
32 code ends
33 end start
结果如图所示:
进行加法前,两个数据段的内存情况:

进行加法后,数据段data3的内存情况如图所示:

 实验任务四:

① 补全程序,实现把逻辑段data1中的8个字数据逆序存储到逻辑段b中。
② 汇编、连接后,在debug中加载程序,运行到line15程序退出前,使用d命令查看数据段data2对应的
内存空间,确认是否实现题目要求。
代码如下:
assume cs:code

data1 segment
    dw 2, 0, 4, 9, 2, 0, 1, 9
data1 ends 

data2 segment
    dw 8 dup(?)
data2 ends

code segment
start:
    mov ax,data1
    mov ds,ax ;data1地址给ds
    mov ax,data2
    mov es,ax ;data2地址给es
    mov bx,0
    mov cx,8
    ;使用默认的SS:SP地址
s1:    mov ax,ds:[bx]
    push ax
    inc bx
    inc bx
    loop s1
     
    mov cx,8
    mov bx,0
    
s2: pop ax
    mov es:[bx],ax
    inc bx
    inc bx
    loop s2
    
    mov ah, 4ch
    int 21h
code ends
end start

实验结果如下:

实验任务五:

 

 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

 

阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指
令的功能。
对程序进行汇编、链接,得到可执行文件,运行并观察结果。
使用debug工具对程序进行调试,执行到程序返回前,即line25执行之后、line27执行之前,观察
结果。
源代码中line19的作用是?
修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果。 
 
结果如下:

line19的作用是实现从小写字母(uist)到大写字母(UIST)的转变

line24的作用使字符显示出不同的颜色

实验任务六:

① 补全程序,将data段中的每行第一个单词从大写->小写。
② 在debug中加载程序,反汇编,执行到line13退出前,用d命令查看data段对应的内存空间,确认每
行第一个单词已经由大写->小写。 
代码如下:
assume cs:code, ds:data

data segment
    db 'Pink Floyd      '
    db 'JOAN Baez       '
    db 'NEIL Young      '
    db 'Joan Lennon     '
data ends

code segment
start:
   mov ax, data
   mov ds, ax
 
   mov cx, 64;一行16个字节
   mov bx, 0
s: or  [bx], byte ptr 20h
   inc bx
   loop s

   mov ah, 4ch
   int 21h
code ends
end start

实验结果:

大写:

小写:

 实验任务七:

① 补全程序,实现题目要求,把年份、收入、雇员人数、人均收入,以结构化方式写入table段中。
表格中,每行数据,在逻辑段table中占16个字节,各项数据占据字节大小分配如下。期中,数据之间用
空格间隔。
代码如下:
 1 assume cs:code, ds:data, es:table
 2 
 3 data segment
 4     db '1975', '1976', '1977', '1978', '1979' 
 5     dw  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 code segment
14 start:
15     mov ax,data
16     mov ds,ax
17     mov ax,table
18     mov es,ax
19     mov bx,0
20     mov si,0
21     mov cx,5
22 
23 s1: mov ax,ds:[bx]
24     mov es:[si],ax
25     add bx,2
26     add si,2
27     mov ax,ds:[bx]
28     mov es:[si],ax
29     add bx,2
30     add si,14
31     loop s1
32 
33     mov bx,20
34     mov si,5
35     mov cx,5
36 s2: mov ax,ds:[bx]
37     mov es:[si],ax
38     add si,2
39     mov word ptr es:[si],0
40     add bx,2
41     add si,14
42     loop s2
43 
44     mov bx,30
45     mov cx,5
46     mov si,10
47  s3:mov ax,ds:[bx]
48     mov es:[si],ax
49     add bx,2
50     add si,16
51     loop s3
52 
53     mov bx,20
54     mov di,30
55     mov cx,5
56     mov si,13
57 
58 s4: mov ax,ds:[bx]
59     mov dx,0
60     div word ptr ds:[di]
61     mov es:[si],ax
62     add bx,2
63     add di,2
64     add si,16
65     loop s4
66 
67     mov ah, 4ch
68     int 21h
69 
70 code ends
71 end start

实验结果:

运行前:

 运行后:

 

 

posted @ 2021-11-09 00:18  WWwwwwwa!  阅读(131)  评论(1编辑  收藏  举报