实验4汇编实验.docx
《实验4汇编实验.docx》由会员分享,可在线阅读,更多相关《实验4汇编实验.docx(13页珍藏版)》请在冰豆网上搜索。
实验4汇编实验
数学与软件科学学院实验报告
学期:
2017至2018第2学期2018年4月4日
课程名称:
汇编语言专业:
信息与计算科学班级:
2015级_5班
实验编号:
4实验项目:
编写、调试具有多个段的程序
指导教师:
冉茂华
姓名:
黄玉含学号:
2015060512实验成绩:
1、将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
assumecs:
code,ds:
data,ss:
stack
datasegment
dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dataends
stacksegment
dw0,0,0,0,0,0,0,0
stackends
codesegment
start:
movax,stack
movss,ax
movsp,16
movax,data
movds,ax
pushds:
[0]
pushds:
[2]
popds:
[2]
popds:
[0]
movax,4c00h
int21h
codeends
endstart
执行结果如下:
说明了cs=___076c_____,ss=____076b______,ds=_______076a_________
(1)、CPU执行程序,程序返回前,data段中的数据是多少?
还未执行时的数据:
执行程序后的数据:
不变,因为程序加载进去段内容就已经固定。
(2)、CPU执行程序,程序返回前,cs=___076c_____,ss=____076b______,ds=_______076a_________。
(3)、设程序加载后,code段的段地址为X,则data段的段地址为___X-2_____,stack段的段地址为____x-1______。
分析:
程序段的段地址总是16的倍数且程序在内存中顺序加载。
2、将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
assumecs:
code,ds:
data,ss:
stack
datasegment
dw0123h,0456h
dataends
stacksegment
dw0,0
stackends
codesegment
start:
movax,stack
movss,ax
movsp,16
movax,data
movds,ax
pushds:
[0]
pushds:
[2]
popds:
[2]
popds:
[0]
movax,4c00h
int21h
codeends
endstart
(1)、CPU执行程序,程序返回前,data段中的数据是多少?
返回前的data段中内容为0123h,0456h,说明在编译链接时data段已经加载进内存。
(2)、CPU执行程序,程序返回前,cs=____076c____,ss=___076B_______,ds=_________076a_______。
(3)、设程序加载后,code段的段地址为X,则data段的段地址为___x-2_____,stack段的段地址为___x-1_______。
(4)、对于如下定义的段:
namesegment
......
nameends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为((N-1)/16+1)*16。
分析:
段在程序加载后实际占据的空间以16为单位。
3、将下面的程序编译、连接,用Debug加载、跟踪,然后回答问题。
assumecs:
code,ds:
data,ss:
stack
codesegment
start:
movax,stack
movss,ax
movsp,16
movax,data
movds,ax
pushds:
[0]
pushds:
[2]
popds:
[2]
popds:
[0]
movax,4c00h
int21h
codeends
datasegment
dw0123h,0456h
dataends
stacksegment
dw0,0
stackends
endstart
(1)、CPU执行程序,程序返回前,data段中的数据是多少?
01230456
(2)、CPU执行程序,程序返回前,cs=___076a_____,ss=_____076e_____,ds=_____076d___________。
(3)、设程序加载后,code段的段地址为X,则data段的段地址为__x+3______,stack段的段地址为___x+4_______。
分析:
程序按顺序执行。
4、如果将1、2、3题中的的最后一条伪指令“endstart”改为“end”,则哪个程序仍然可以正确的执行?
请说明原因。
答:
第3题的程序,因为程序顺序执行。
分析:
如果不指名start入口地址,并且使用end替换endstart,程序仍可以执行。
因为如果不指名入口,程序则从加载进内存的第一个单元起开始执行,但因为程序中有部分是作为数据使用的,如果不指名入口,cpu会将数据当作汇编指令执行,所以一般要指明入口地址。
5、程序如下,编写code段中的代码,将a段和b段中的数据依次相加,将结果存在c段中。
assumecs:
code
asegment
db1,2,3,4,5,6,7,8
aends
bsegment
db1,2,3,4,5,6,7,8
bends
csegment
db0,0,0,0,0,0,0,0
cends
codesegment
start:
?
codeends
endstart
答:
代码如下:
assumecs:
code
asegment
db1,2,3,4,5,6,7,8
aends
bsegment
db1,2,3,4,5,6,7,8
bends
csegment
db0,0,0,0,0,0,0,0
cends
codesegment
start:
movax,c
movds,ax
movcx,8
movbx,0
movax,a
moves,ax
movax,b
movss,ax
s:
moval,es:
[bx]
addal,ss:
[bx]
mov[bx],al
incbx
loops
movax,4c00h
int21h
codeends
endstart
6、编写code段中的代码,用push指令将a段中的前8个字型数据逆序存放到b段中。
assumecs:
code
asegment
dw1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
aends
bsegment
dw0,0,0,0,0,0,0,0
bends
codesegment
start:
?
codeends
endstart
代码如下:
assumecs:
code
asegment
dw1,2,3,4,5,6,7,8,9,0ah,0bh,0ch,0dh,0eh,0fh,0ffh
aends
bsegment
dw0,0,0,0,0,0,0,0
bends
codesegment
start:
movax,a
movds,ax
movax,b
movss,ax
movsp,10h
movcx,8
movbx,0
s:
push[bx]
addbx,2
loops
movax,4c00h
int21h
codeends
endstart