实验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命令

 

posted @ 2020-11-26 21:20  邻依邻袂  阅读(80)  评论(3)    收藏  举报