一、实验目的

1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法
4. 理解并掌握各种寻址方式的灵活应用
5. 掌握汇编指令loop, and, or,div, mul的用法

二、实验准备

复习教材chapter 6-8章。
chapter 6 包含多个段的程序
chapter 7 更灵活的定位内存地址的方法
chapter 8 数据处理的两个基本问题

三、实验内容

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         ;设置循环次数5,因为‘Nuist’有五个字母
16         mov si, 0         ;设置(si)=0,ds:si指向‘Nuist’的第一个字母
17         mov di, 0f00h     ;起始内存单元地址
18 s:      mov al, [si]      ;将ASCII码从ds:si所指向的单元中取出
19         and al, 0dfh      ;变为大写字母
20         mov es:[di], al   ;将数据送入现存地址中
21         mov al, [5+si]    ;取出data段的第si+5字节
22         mov es:[di+1], al ;控制输出字符的颜色
23         inc si            ;si+1,ds:si指向下一个字母
24         add di, 2         ;di+2
25         loop s            ;实现循环
26 
27         mov ah, 4ch
28         int 21h
29 code ends
30 end start
阅读源程序,从理论上分析源代码的功能,尤其是line15-25,循环实现的功能是什么,逐行理解每条指令的功能。
 源代码的功能是:通过循环将data数据段中的字母转换为大写,并显示。
①使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。

②使用debug工具对程序进行调试,执行到程序返回前,即line27之前,观察结果。

用r命令查看

 
用u命令精确进行反汇编

执行到程序返回前

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

db 5 dup(2) 
--> 改成: 
db 2,3,4,5,6
基于观察,分析、猜测这里的数值作用是什么。
修改后运行结果:

 这里数值的作用是用来控制输出字符的颜色。

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 code segment
 6 start:mov ax,data
 7       mov ds,ax
 8       mov di,0
 9       mov cx,5
10       
11   s1:mov ah,0             
12       mov al,ds:[di]
13       mov bl,10
14       div bl
15       mov ds:[10+di],al   
16       mov ds:[11+di],ah 
17 
18       mov ah,2
19       mov dl,ds:[10+di]
20       add dl,30h   
21       int 21h
22  
23       mov ah,2
24       mov dl,ds:[11+di]  
25       add dl,30h          
26       int 21h
27 
28       mov ah,2
29       mov dl," "
30       int 21h
31       inc di
32       loop s1
33        
34       mov ax,4c00h
35       int 21h
36 code ends
37 end start

运行结果:

3.实验任务3

教材「实验5 编写、调试具有多个段的程序」(1)

 将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。程序源码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

对程序进行编译、连接:

debug调试,用u命令进行反汇编,用g命令执行程序到程序退出前:

 

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

data段中的数据为:23 01 56 04 89 07 BC 0A EF 0D ED 0F BA 0C 87 09

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

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

4.实验任务4

教材「实验5 编写、调试具有多个段的程序」(2)

将下面的程序编译、连接,用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

对程序进行编译、连接:

debug调试,用u命令进行反汇编,用g命令执行程序到程序退出前:

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

 data段中的数据为:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00 

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

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

④对于如下定义的段:

name segment
...
name ends

如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为⌈N/16⌉*16

5.实验任务5

教材「实验5 编写、调试具有多个段的程序」(3)

将下面的程序编译、连接,用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

对程序进行编译、连接:

debug调试,用u命令进行反汇编,用g命令执行程序到程序退出前:

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

data段中的数据为:23 01 56 04 00 00 00 00 00 00 00 00 00 00 00 00 

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

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

6.实验任务6

教材「实验5 编写、调试具有多个段的程序」(4)

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

 答:第(3)题中的程序可以正确执行,即task5.exe。如果不指明程序的入口,CPU会按顺序执行,CPU无法自动识别哪些是指令哪些是数据,第(1)和(2)题中开头是数据段,不能直接执行指令,第(3)题是汇编指令段开头,按顺序能够正确执行。

7.实验任务7

教材「实验5 编写、调试具有多个段的程序」(5)
程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。程序源码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   ; 在集成软件环境中,请将此处的段名称由c→改为c1或其它名称
11         db 8 dup(0)
12 c ends
13 
14 code segment
15 start:
16         mov ax,a
17         mov ds,ax
18         mov ax,b
19         mov es,ax
20         mov ax,c
21         mov ss,ax
22         mov bx,0
23         mov cx,8
24 s:      mov ax,[bx]
25         mov ss:[bx],ax
26         mov ax,es:[bx]
27         add ss:[bx],ax
28         inc bx
29         loop s
30         mov ax,4c00h
31         int 21h
32 code ends
33 end start

对程序进行编译、连接:

用debug进行调试,用u命令进行反汇编

查看:

 

8.实验任务8

教材「实验5 编写、调试具有多个段的程序」(6)
程序如下,编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。程序源码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 bx,0
16        mov ss,ax
17        mov sp,16
18        mov cx,8
19 s:     push [bx]
20        add bx,2
21        loop s
22        mov ax,4c00h
23        int 21h
24 code ends
25 end start

对程序进行编译、连接:

使用u命令反汇编后再执行:

 

查看:

 

 

posted on 2020-11-26 18:39  夏梦陆离  阅读(133)  评论(4编辑  收藏  举报