汇编语言程序设计实验报告五

一、实验目的

1. 理解和掌握将数据、代码、栈放入不同段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
二、实验准备
1. 结合第 6 章教材和课件,复习第 6 章内容
2. 复习第 3 章「栈」的知识
三、实验内容
教材 133 实验 5
任务一:将下面的程序编译、连接,用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

先在debug下进行编译,连接

在debug环境下进行加载

任务一结果为:

1. CPU执行程序,程序返回前,data段中的数据为:0123H,  0456H,  0789H,  0ABCH,  0DEFH,  0FEDH,  0CBAH,  0987H;

 2. CPU执行程序,程序返回前,cs=076C ,ss=076B ,ds=076A;

 3. 程序加载后,code段的段地址为X,则data段的段地址为: X-2 ,stack段的段地址为: X-1;

任务二:将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。

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

 操作步骤与任务一相似

任务二结果为:

1. CPU执行程序,程序返回前,data段中的数据为:0123h,  0456h;

2. CPU执行程序,程序返回前,cs=076C  ,ss=076B  ,ds=076A ;

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

4. 对于如下定义的段:

name segment

name ends

如果段中的数据占N个字节则程序加载后,该段实际占有的空间为: (N/16+1)*16;

任务三:将下面的程序编译、连接,用debug加载、跟踪,然后回答问题。

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

任务三结果:

1. CPU执行程序,程序返回前,data段中的数据为:0123h,  0456h

2. CPU执行程序,程序返回前,cs=076A ,ss=076E ,ds=076D 

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

任务四:将以上三题中最后一条伪指令“end start"改为”end"(也就是说,不指明程序的入口),则哪个程序仍然可以正确执行?请说明原因。

任务一二的代码在反汇编之后出现了变化

任务三的代码没变

任务五:程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存到c段中。

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 bx,0
mov cx,8
mov ax,a
mov ds,ax
mov ax,c
mov es,ax
s: mov dx,0
mov ax,a
mov ds,ax
add dl, [bx]
mov ax,b
mov ds,ax
add dl,[bx]
mov es:[bx],dl
inc bx
loop s
mov ax,4c00h
int 21h

code ends
end start

任务五结果为:02 04 06 08 0A 0C 0E 10

任务六:编写code段中的代码,用push命令将a段中的前8个字型数据,逆序存储到b段中

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 cx,8
mov bx,0
s: push [bx]
add bx,2
loop s
mov ax,4c00h
int ax,21h
code ends
end start

实验总结:

(一)一定要熟练掌握loop pop push dw 等一系列操作指令的用途和作用

(二)对实验五和实验六的理解还不是很到位,代码参考了同学的,希望有同学能在下面留言告知逆序执行的思路

猜你喜欢

转载自www.cnblogs.com/frank111111/p/10052824.html