汇编实验.docx
- 文档编号:10166739
- 上传时间:2023-02-09
- 格式:DOCX
- 页数:52
- 大小:1.64MB
汇编实验.docx
《汇编实验.docx》由会员分享,可在线阅读,更多相关《汇编实验.docx(52页珍藏版)》请在冰豆网上搜索。
汇编实验
汇编语言
实验报告
学号:
姓名:
提交日期:
成绩:
【实验编号】
1
【实验名称】
用机器语言和汇编语言编程
【实验内容】
(1).使用Debug,将上面的程序段写入内存,逐条执行,观察每条指令执行后,CPU中相关寄存器中的内容变化。
机器码汇编指令
B8204emovax,4e20h
051614addax,1416h
Bb0020movbx,2000h
01d8addax,bx
89c3movbx,ax
01d8addax,bx
B81a00movax,001ah
Bb2600movbx,0026h
00d8addal,bl
00dcaddah,bl
00c7addbh,al
B400movah,0
00d8addal,bl
049caddal,9ch
(2).将下面的3条指令写入从2000:
0开始的内存单元中,利用这三条指令计算2的8次方。
movax,1
addax,ax
jmp2000:
0003
(3).查看内存中的内容
PC机主板上的ROM中写有一个生产日期,在内存fff00h~ffffffh的某几个单元中,请找到这个生产日期并试图改变它。
试图将09/07/10修改为12/12/12
因为为之都寄存器,所以只能读而不能修改。
(4).向内存从B8100开始的单元中填写数据,如:
-eb810:
00000101020203030404
填写不同的数据,观察现象
现象:
不同的数据所呈现出的图形是不一样的,但其出现在屏幕上的位置是没变的。
改变填写的地址,观察产生的现象
现象:
改变所存储的位置,所产生的图像是不变的,但其出现在屏幕上的位置发生了变化。
【实验编号】
2
【实验名称】
汇编语言程序的编写过程
【实验目的】
1.掌握汇编语言程序的编写、编译、链接、执行过程;
2.了解程序分段的目的和意义;
【实验内容】
(1).使用debug,将上面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
movax,ffff
movds,ax
movax,2200
movss,ax
movsp,0100
movax,[0];ax=5BEA
addax,[2];ax=5CCA
movbx,[4];bx=30F0
movbx,[6];bx=6029
pushax;sp=00FE;修改的内存单元的地址是2200:
FE和2200:
FF内容为5CCA
pushbx;sp=00FC;修改的内存单元的地址是2200:
FC和2200:
FD内容为6029
popax;sp=00FE;ax=6029
popbx;sp=0100;bx=5CC0
push[4];sp=00FE;修改的内存单元的地址是2200:
FE和2200:
FF内容为30F0
push[6];sp=00FC;修改的内存单元的地址是2200:
FC和2200:
FD内容为2F39
【实验编号】
3
【实验名称】
编程、编译、连接、跟踪
【实验内容】
(1).将下面的程序保存为t1.asm文件,将其生成可执行文件t1.exe
assumecs:
codesg
codesgsegment
movax,2000h
movss,ax
movsp,0
addsp,10
popax
popbx
pushax
pushbx
popax
popbx
movax,4c00h
int21h
codesgends
end
生成exe文件
(2).用debug跟踪t1.exe的执行过程,写出每一步执行后,相关寄存器中的内容和栈顶的内容。
(3).PSP的开头两个字节是CD20,用debug加载t1.exe,查看psp的内容。
【实验编号】
4
【实验名称】
[bx]和loop的使用
【实验内容】
(1).编程,向内存0:
200~0:
23f依次传送数据0~63(3fh)。
程序如下:
assumecs:
codesg
codesgsegment
movax,0
movds,ax
movbx,0200h
movax,0
movcx,64
s:
mov[bx],ax
incbx
incax
loops
movax,4c00h
int21h
codesgends
end
运行结果如下:
(2)编程,向内存0:
200~0:
23f依次传送数据0~63(3fh),程序中只能使用九条指令,其中包括“movax,4c00h”和“int21h”
程序如下:
assumecs:
codesg
codesgsegment
movax,20h
movds,ax
movbx,0
movcx,64
s:
mov[bx],bl
incbx
loops
movax,4c00h
int21h
codesgends
end
运行结果如下:
(3).下面程序的功能是将“movax,4c00”之前的指令复制到内存0:
200处,补全程序。
上机调试,跟踪运行结果。
assumecs:
code
codesegment
movax,cs
movds,ax
movax,0020h
moves,ax
movbx,0
movcx,17h
s:
moval,[bx]
moves:
[bx],al
incbx
loops
movax,4c00h
int21h
codeends
end
运行结果如下:
【实验编号】
5
【实验名称】
编写、调试具有多个段的程序
【实验内容】
(1)将下面程序编译连接,用debug加载、跟踪,然后回答问题。
assumecs:
code,ds:
data,ss:
stack
datasegment
dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987
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
end
①CPU执行程序,程序返回前,data段中的数据不变。
②CPU执行程序,程序返回前,CS=0C88H,SS=0C87H,DS=0C86H。
③设程序加载后,CODE段的段地址为X,则DATA段的段地址为X-2,STACK段的段地址为X-1。
运行结果如下:
(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
①CPU执行程序,程序返回前,data段中的数据不变。
②CPU执行程序,程序返回前,CS=0C88H,SS=0C87H,DS=0C86H。
③设程序加载后,CODE段的段地址为X,则DATA段的段地址为X-2,STACK段的段地址为X-1。
④对于如下定义的段:
namesegment
……
nameends
如果段中的数据占N个字节,则程序加载后,该段实际占有的空间为((N+15)/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
①CPU执行程序,程序返回前,data段中的数据不变。
②CPU执行程序,程序返回前,CS=0C86H,SS=0C8AH,DS=0C89H。
③设程序加载后,CODE段的段地址为X,则DATA段的段地址为X+3,STACK段的段地址为X+4。
程序运行如下:
(4)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,a
movds,ax
movax,b
moves,ax
movax,c
movss,ax
movbx,0
movcx,8
s:
movax,[bx]
movss:
[bx],ax
movax,es:
[bx]
addss:
[bx],ax
incbx
loops
movax,4c00h
int21h
codeends
endstart
(6)程序如下,编写code段中代码,用PUSH指令将A段中的前8个字型数据,逆序存储到B段中。
assumecs:
code
asegment
dw1,2,3,4,5,6,7,8
aends
bsegment
dw0,0,0,0,0,0,0,0
bends
codesegment
start:
movax,a
movds,ax
movax,b
movbx,0
movss,ax
movsp,16
movcx,8
s:
push[bx]
addbx,2
loops
codeends
endstart
【实验编号】
6
【实验名称】
实践课程中的程序
【实验内容】
(1).将课程中所有将结果的程序上机调试,用debug跟踪其执行过程,并在过程中进一步理解所讲内容。
a.程序7.1
assumecs:
code
datasegment
db'unIX'
db'foRK'
dataends
codesegment
start:
moval,'a'
movbl,'b'
movax,4c00h
int21h
codeends
endstart
运行如下:
b.7.4程序
assumecs:
codesg,ds:
datasg
datasgsegment
db'BaSiC'
db'iNfOrMaTiOn'
datasgends
codesgsegment
start:
movax,datasg
movds,ax
movbx,0
movcx,5
s:
moval,[bx]
andal,11011111b
mov[bx],al
incbx
loops
movbx,5
movcx,11
s0:
moval,[bx]
oral,00100000b
mov[bx],al
incbx
loops0
movax,4c00h
int21h
codesgends
endstart
程序运行如下:
(2).编程,完成问题7.9中的程序
程序如下:
assumecs:
codesg,ss:
stacksg,ds:
datasg
stacksgsegment
dw0,0,0,0,0,0,0,0
stacksgends
datasgsegment
db'1.display'
db'2.brows'
db'3.replace'
db'4.modify'
datasgends
codesgsegment
start:
movax,stacksg
movss,ax
movsp,16
movax,datasg
movds,ax
movbx,0
movcx,4
s:
pushcx
movsi,3
movcx,4
s0:
moval,[bx+si]
andal,11011111b
mov[bx+si],al
incsi
loops0
addbx,16
popcx
loops
movax,4c00h
int21h
codesgends
endstart
运行如下:
【实验编号】
7
【实验名称】
寻址方式在结构化数据访问中的应用
【实验内容】
Poweridea公司从1975年成立一直到1995年的基本情况如下:
下面的程序中已经定义好了这些数据:
assumecs:
codesg,ds:
data,es:
table
datasegment
db'1975','1976','1977','1978','1979','1980','1981','1982','1983'
db'1984','1985','1986','1987','1988','1989','1990','1991','1992'
db'1993','1994','1995'
dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw11452,14430,15257,17800
dataends
tablesegment
db21dup('yearsummne?
?
')
tableends
codesgsegment
start:
movax,data
movds,ax
movax,table
movss,ax
movbx,0
movsi,0
movbp,0
movcx,21
s0:
movax,[bx+si]
mov[bp+0],ax
addsi,2
movax,[bx+si]
mov[bp+2],ax
addsi,2
addbp,10h
loops0
movcx,21
movbp,0
movsi,0
s1:
movax,[bx+si+84]
mov[bp+5],ax
addsi,2
movax,[bx+si+84]
mov[bp+7],ax
addsi,2
addbp,10h
loops1
movcx,21
movbp,0
movsi,0
s2:
movax,[bx+si+168]
mov[bp+10],ax
addsi,2
addbp,10h
loops2
movcx,21
movbp,0
s3:
movax,[bp+5]
movdx,[bp+7]
divwordptr[bp+10]
mov[bp+13],ax
addbp,10h
loops3
movax,4c00h
int21h
codesgends
endstart
运行结果如下:
【实验编号】
8
【实验名称】
分析一个奇怪的程序
【实验内容】
分析下面的程序,在运行前思考:
这个程序可以正确返回吗?
运行后再思考:
为什么是这种结果?
通过这个程序加深对相关内容的理解。
assumecs:
codesg
codesgsegment
movax,4c00h
int21h
start:
movax,0ax=0
s:
nop占一个字节,机器码为90
nop占一个字节,机器码为90
movdi,offsets(di)=s偏移地址
movsi,offsets2(si)=s2偏移地址
movax,cs:
[si](ax)=jmpshorts1指令对应机器码f6eb
movcs:
[di],axjmpshortsi覆盖s处指令2条nop指令
s0:
jmpshorts
s1:
movax,0
int21h
movax,0
s2:
jmpshorts1
nop
codesgends
endstart
程序运行如下:
【实验编号】
9
【实验名称】
根据材料编程
【实验内容】
编程:
在屏幕中间分别显示绿色、绿底红字、白底蓝字的字符串‘welcometomasm!
’。
程序如下:
assumecs:
code,ds:
code
datasegment
db'welcometomasm!
'
dataends
codesegment
start:
movax,data
movds,ax
movbx,0
movax,0b800h
moves,ax
movsi,160*12+32*2
movcx,16
s:
moval,[bx]
movah,02h
moves:
[si],ax
movah,24h
moves:
[si+160],ax
movah,71h
moves:
[si+320],ax
incbx
addsi,2
loops
movax,4c00h
int21h
codeends
endstart
运行结果如下:
【实验编号】
10
【实验名称】
汇编语言程序的编写过程
【实验内容】
(1).子程序的描述
名称:
show_str
功能:
在指定的位置,用指定的颜色,显示一个用0结束的字符串。
参数:
(dh)=行号(取值范围0~24);
(dl)=列号(取值范围0~79);
(cl)=颜色;
ds:
si指向字符串的首地址。
返回:
无。
程序如下:
assumecs:
code
datasegment
dbWelcometomasm!
',0
dataends
codesegment
start:
movdh,8
movdl,3
movcl,2
movax,data
movds,ax
movsi,0
callshow_str
movax,4c00h
int21h
show_str:
pushax
pushbx
pushes
pushsi
movax,0b800h
moves,ax
movax,160
muldh
movbx,ax
movax,2
muldl
addbx,ax
moval,cl
movcl,0
show0:
movch,[si]
jcxzshow1
moves:
[bx],ch
moves:
[bx+1],al
incsi
addbx,2
jmpshow0
show1:
popsi
popes
popbx
popax
ret
codeends
endstart
运行如下:
(2).子程序描述
名称:
divdw
功能:
进行不会产生溢出的除法运算,被除数为dword型,除数为word型,结果为dword型。
参数:
(ax)=dword型数据的低16位;
(dx)=dword型数据的高16位;
(cx)=除数。
返回:
(dx)=结果的高16位;
(ax)=结果的低16位;
(cx)=余数。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 实验
