实验五报告
实验 5 编写、调试具有多个段的程序
计软院 专业 年级 2017 级 4 班次 任心怡 姓名 20171308152 学号
一、实验目的
1. 理解和掌握将数据、代码、栈放入不同段的程序的编写和调试
2. 理解具有多个段的汇编源程序对应的目标程序执行时,内存分配方式
二、实验准备
1. 结合第 6 章教材和课件,复习第 6 章内容
2. 复习第 3 章「栈」的知识
三、实验内容
教材 133 实验 5
(1)ex5_1
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段中的数据截图如下:
(2)ex5_2
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
(3)ex5_3
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
操作步骤同上得到实验结果截图如下:
(4)如果将(1)、(2)、(3)题中的最后一条伪指令“end start"改成“end”(也就是说,不指名程序的入口),则哪个程序仍然可以正确执行?请说明原因
(3)的代码可以正确执行。如果去掉start,dw定义的字节就会被当做代码来执行,而(3)中使用的data段来实现的,所以可以实现。
(5)编写code段中代码,将a段和b段中的数据依次相加,将结果送到c段。
经过编辑链接,运行代码验证结果,截图如下:
验证可以实现。
(6)编写code段中的代码,用push指令将a段中的前8个字型数据,逆序存储到b段中。
代码如下:
运行结果如下:
四:实验总结
在g指令来进行反汇编的时候一定要注意是运行到该条指令的前一条。
用u指令时,要看cx的值,当然不是cx是多少就写到多少,具体的值要看具体的题目。在实验一中,因为dw的定义已经占用了一部分代码,所以要去掉这部分这样。
还有就是要多练习,在写代码是将数据段,栈段,代码段分开写。