实验3 多个段的汇编源程序编写与调试
一、实验目的
1. 理解和掌握将数据、代码、栈放入不同逻辑段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
3. 掌握大小写字符的转换方法、数字字符和数值之间的转换方法
4. 理解并掌握各种寻址方式的灵活应用
5. 掌握汇编指令loop, and, or,div, mul的用法
二、实验准备
复习教材chapter 6-8章。
chapter 6 包含多个段的程序
chapter 7 更灵活的定位内存地址的方法
chapter 8 数据处理的两个基本问题
三、实验内容
1. 实验任务(1)
assume cs:code, ds:data
data segment
db 'Nuist'
db 5 dup(2)
data ends
code segment
start:
mov ax, data
mov ds, ax
mov ax, 0b800H
mov es, ax
mov cx, 5
mov si, 0
mov di, 0f00h
s: mov al, [si]
and al, 0dfh
mov es:[di], al
mov al, [5+si]
mov es:[di+1], al
inc si
add di, 2
loop s
mov ah, 4ch
int 21h
code ends
end start
初始化si和di后,将数据段中对应的字符改为大写,写入显存,高位赋值改变字符颜色,进行5次循环。使用masm、link对task1.asm进行汇编、链接,得到可执行文件task1.exe,运行并观察结果。

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

修改line4里5个字节单元的值,重新汇编、链接、运行,观察结果
结论:数值的作用是改变字符颜色。
2.实验任务(2)
编写程序,在屏幕上以十进制整数形式打印输出 23 50 66 71 35 这5个两位数。
assume cs:code,ds:data
data segment
db 23,50,66,71,35
data ends
code segment
start:
mov ax,data
mov ds,ax
mov di,0
mov cx,5
s1: mov ah,0
mov al,ds:[di]
mov bl,10
div bl
mov ds:[10+di],al
mov ds:[11+di],ah
mov ah,2
mov dl,ds:[10+di]
add dl,30h
int 21h
mov ah,2
mov dl,ds:[11+di]
add dl,30h
int 21h
mov ah,2
mov dl," "
int 21h
inc di
loop s1
mov ax,4c00h
int 21h
code ends
end start
运行结果:
3.实验任务(3)
将下面的程序编译、链接、用debug加载、跟踪。
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h
data ends
stack segment
dw 0, 0, 0, 0, 0, 0, 0, 0
stack ends
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start

分析:
data段数据为 23 01 56 04 89 07 bc 0a ef 0d ed 0f ba 0c 87 09
cs=076c,ss=076B,ds=076A;
设程序加载后,code段的段地址为X,则data段的段地址为X-2,stack段的段地址为X-1。
4.实验任务(4)
程序源码task4.asm:
assume cs:code, ds:data, ss:stack
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0, 0
stack ends
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
end start
运行结果:


5.实验任务(5)
教材实验5 编写、调试具有多个段的程序
assume cs:code, ds:data, ss:stack
code segment
start: mov ax,stack
mov ss, ax
mov sp,16
mov ax, data
mov ds, ax
push ds:[0]
push ds:[2]
pop ds:[2]
pop ds:[0]
mov ax,4c00h
int 21h
code ends
data segment
dw 0123h, 0456h
data ends
stack segment
dw 0,0
stack ends
end start

分析:
data段中的数据:0123H,0456H
cs=076AH,ss=076EH,ds=076DH
data段的段地址为X+3,stack段的段地址为X+4
6.实验任务(6)
只有教材中实验5的3 的程序能够正常运行。若将 end start 改为 end,不指明入口,会默认从 076A:0 开始执行,前面2个程序076A:0 都是存储的是数据段,不能执行;而第3个是将数据段和栈段放在代码段后面的,默认进入的就是代码段,所以可以执行。
7.实验任务(7)
assume cs:code
a segment
db 1,2,3,4,5,6,7,8
a ends
b segment
db 1,2,3,4,5,6,7,8
b ends
c segment
db 8 dup(0)
c ends
code segment
start:
mov ax,a
mov ds,ax
mov si,0
mov cx,9
s: mov ax,0
mov al,[si]
add al,[si+16]
mov [si+32],al
inc si
loop s
mov ah,4ch
int 21h
code ends
end start

a,b,c段的长度都是16,所以可通过加偏移量16 32访问,使用-g 19执行,查看a,b,c的数据,看到最后一行的数据是由前面两行相加得到的,满足要求。

8.实验任务(8)
assume cs:code
a segment
dw 1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
a ends
b segment
dw 8 dup(0)
b ends
code segment
start:
mov ax,b
mov ss,ax
mov sp,10h
mov ax,a
mov ds,ax
mov si,0
mov cx,9
s: push ds:[si]
add si,2
loop s
mov ah,4ch
int 21h
code ends
end start

反汇编后得知程序在 001ah处返回,使用 -g 001a命令

浙公网安备 33010602011771号