汇编实验题.docx
- 文档编号:6006332
- 上传时间:2023-01-02
- 格式:DOCX
- 页数:19
- 大小:18.97KB
汇编实验题.docx
《汇编实验题.docx》由会员分享,可在线阅读,更多相关《汇编实验题.docx(19页珍藏版)》请在冰豆网上搜索。
汇编实验题
实验2用机器指令和汇编指令编程(第70页)
2.实验任务
(1)使用Debug,将下面的程序段写入内存,逐条执行,根据指令执行后的实际运行情况填空。
从第一空开始依次如下:
ax=5BEA
ax=5CCA
bx=30F0
bx=6029
sp=FE220FE5CCA
sp=FC220FC6029
sp=FE6029
sp=100H5CCA
sp=FE220FE30F0
sp=FC220FC2E39
实验4[BX]和loop的使用(第113页)
-------------------------------
(1)编程,向内存0:
200~0:
23F依次传送数据0~63(3FH)。
程序如下:
assumecs:
codesg
codesgsegment
movax,0020h
movds,ax
movbx,0
movdl,0
movcx,40h
s:
mov[bx],dl
incdl
incbx
loops
movax,4c00h
int21h
codesgends
end
(2)编程,向内存0:
200~0:
23F依次传送数据0~63(3FH),程序中只能使用9条指令,9条指令中包括“movax,4c00h”和“int21h”。
程序如下:
assumecs:
codesg
codesgsegment
movax,0020h
movds,ax
movbl,0
movcx,40h
s:
mov[bx],bl
incbl
loops
movax,4c00h
int21h
codesgends
end
(3)下面的程序的功能是将“movax,4c00h”之前的指令复制到内存0:
200处,补全程序。
上机调试,跟踪运行结果。
assumecs:
code
codesegment
movax,code;code为所填写的数据
movds,ax
movax,0020h
moves,ax
movbx,0
movcx,18h;18h为所填写的数据
s:
moval,[bx]
moves:
[bx],al
incbx
loops
movax,4c00h
int21h
codeends
end
assumecs:
codesg
codesgsegment
dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:
movax,0
movds,ax
movbx,0
movcx,8
s:
movax,[bx]
movcs:
[bx],ax;此条指令为所填指令
addbx,2
loops
movax,4c00h
int21h
codesgends
endstart
(2)
assumecs:
codesg
codesgsegment
dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw0,0,0,0,0
start:
movax,cs;cs为所填第一空
movss,ax
movsp,1ah;此条指令为所填第二空
movax,0
movds,ax
movbx,0
movcx,8
s:
push[bx]
popcs:
[bx];此条指令为所填第三空
addbx,2
loops
movax,4c00h
int21h
codesgends
endstart
实验5编写、调试具有多个段的程序(第123页)
1.保持不变
2.<考虑不同机子环境不同,答案无法统一>
3.X-2,X-1
(2)
1.保持不变
2.<考虑不同机子环境不同,答案无法统一>
3.X-2,X-1
4.(N/16+1)*16[说明:
N/16只取整数部分]
(3)
1.保持不变
2.<考虑不同机子环境不同,答案无法统一>
3.X+3,X+4
(5)完整程序如下:
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
moves,ax
movax,c
movds,ax
movbx,0
movcx,8
s1:
movax,es:
[bx]
add[bx],ax
addbx,2
loops1
movax,b
moves,ax
movds,ax
movbx,0
movcx,8
s2:
movax,es:
[bx]
add[bx],ax
addbx,2
loops2
movax,4c00h
int21h
codeends
endstart
(6)完整程序如下:
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,b
movss,ax
movsp,10h
movax,a
movds,ax
movbx,0
movcx,8
s:
push[bx]
addbx,2
loops
movax,4c00h
int21h
codeends
endstart
实验6实践课程中的程序(第147页)
(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寻址方式在结构化数据访问中的应用(第160页)
完整程序如下:
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'
;以上是表示21年的21个字符串
dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514
dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000
;以上是表示21年公司总收的21个dword型数据
dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226
dw11542,14430,45257,17800
dataends
tablesegment
db21dup('yearsummne?
?
')
tableends
codesgsegment
start:
movax,data
movds,ax
movax,table
moves,ax
movbx,0
movsi,0
movdi,0
movcx,21
s:
;进入循环
moval,[bx]
moves:
[di],al
moval,[bx+1]
moves:
[di+1],al
moval,[bx+2]
moves:
[di+2],al
moval,[bx+3]
moves:
[di+3],al
;以上8句的作用是存放年份
movax,54h[bx];第一个'年收入'的段基址为54H
movdx,56h[bx]
moves:
5h[di],ax
moves:
7h[di],dx
;以上4句的作用是存放公司总收入
movax,0A8h[si];第一个'人数'的段基址为0A8H
moves:
0Ah[di],ax
;以上2句是存放公司的人数
movax,54h[bx]
divwordptrds:
0A8h[si]
moves:
0dh[di],ax
;以上3句是存放人均收入
addbx,4
addsi,2
adddi,16
;以上3句是为下一次循环时存放数据做准备
;3个寄存器递增的速度决定了所要存取的数据的位置的偏移地址
loops;跳到标号s处
movax,4c00h
int21h
codesgends
endstart
实验8分析一个奇怪的程序(第174页)分析下面的程序,在运行前思考:
这个程序可以正确返回吗?
运行后再思考:
为什么是这种结果?
通过这个程序加深对相关内容的理解。
assumecs:
codesg
codesgsegment
movax,4c00h
int21h
start:
movax,0
s:
nop
nop
movdi,offsets
movsi,offsets2
movax,cs:
[si]
movcs:
[di],ax
s0:
jmpshorts
s1:
movax,0
int21h
movax,0
s2:
jmpshorts1
nop
codesgends
endstart
程序可以正常返回。
详细分析:
在此题中较为深入地考察了‘段内直接短转移’[形如:
jmpshort标号]的概念。
我们知道程序中:
movdi,offsets
movsi,offsets2
movax,cs:
[si]
movcs:
[di],ax
实验9根据材料编程(第175页)
assumecs:
code,ds:
data,ss:
stack
datasegment
db'welcometomasm!
';定义要显示的字符串(共16字节)
db02h,24h,71h;定义三种颜色属性
dataends
stacksegment
dw8dup(0)
stackends
codesegment
start:
movax,data
movds,ax
movax,stack
movss,ax
movsp,10h
movbx,0
movdi,0
movax,0b872h;算出屏幕第12行中间的显存的段起始位置放入ax中
movcx,3;外循环为3次,因为要显示三个字符串
s3:
pushcx;三个进栈操作为外循环s3保存相关寄存器的值
pushax;以防止它们的值在内循环中被破坏
pushdi
moves,ax;此时es为屏幕第12行中间的显存的段起始位置
movsi,0
movdi,0
movcx,10h;内循环为10h次,因为一个字符串中含10h个字节
s1:
moval,ds:
[bx+si]
moves:
[bx+di],al
incsi
adddi,2
loops1;此循环实现偶地址中存放字符
movsi,1;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备
popdi;将di的值恢复成进入内循环之前的时候的值
moval,ds:
10h[bx+di];取颜色属性[源OP寻址方式:
相对基址变址]
movcx,10h;第二个内循环也为10h次
s2:
moves:
[bx+si],al
addsi,2
loops2;此循环实现奇地址中存放字符的颜色属性
;以下4句为下一趟外循环做准备
incdi
popax
addax,0ah;将显存的段起始地址设为当前行的下一行
;[在段地址中加0ah,相当于在偏移地址中加了0a0h(=160d)]
popcx
loops3
movax,4c00h
int21h
codeends
endstart
实验10编写子程序(第194页)
1.显示子程序
完整程序如下:
datasegment
db'Welcometomasm!
',0
dataends
codesegment
assumecs:
code,ds:
data
start:
movdh,1;dh装行号(范围:
1--25)
movdl,1;dl装列号(范围:
1--80)[注:
每超过80等于行号自动加1]
movcl,0cah;cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)
movax,data
movds,ax
movsi,0
callshow_str
movax,4c00h
int21h
show_str:
;显示字符串的子程序[定义开始]
pushcx
pushsi
moval,0A0h
decdh;行号在显存中下标从0开始,所以减1
muldh
movbx,ax
moval,2
muldl
subax,2;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
addbx,ax;此时bx中存放的是行与列号的偏移地址
movax,0B800h
moves,ax;es中存放的是显存的第0页(共0--7页)的起始的段地址
movdi,0
moval,cl
movch,0
s:
movcl,ds:
[si]
jcxzok
moves:
[bx+di],cl;偶地址存放字符
moves:
[bx+di+1],al;奇地址存放字符的颜色属性
incsi
adddi,2
jmpshorts
ok:
popsi
popcx
ret;显示字符串的子程序[定义结束]
codeends
endstart
2.解决除法溢出的问题(第197页)
完整程序如下:
assumecs:
code,ss:
stack
stacksegment
dw8dup(0)
stackends
codesegment
start:
movax,stack
movss,ax
movsp,10h
movax,4240h
movdx,0fh
movcx,0ah
calldivdw
movax,4c00h
int21h
divdw:
;子程序定义开始
pushax
movax,dx
movdx,0
divcx
movbx,ax
popax
divcx
movcx,dx
movdx,bx
ret;子程序定义结束
codeends
endstart
3.数值显示(第198页)
完整程序如下:
assumecs:
code,ds:
data
datasegment
db10dup(0)
dataends
codesegment
start:
movax,12666
movbx,data
movds,bx
movsi,0
calldtoc
movdh,8
movdl,3
movcl,0cah
callshow_str
movax,4c00h
int21h
dtoc:
;数值显示的子程序定义
pushdx
pushcx
pushax
pushsi
pushbx
movbx,0
s1:
movcx,10d
movdx,0
divcx
movcx,ax
jcxzs2
adddx,30h
pushdx
incbx
jmpshorts1
s2:
adddx,30h
pushdx
incbx;再进行一次栈操作(补充当"商为零而余数不为零"时的情况)
movcx,bx
movsi,0
s3:
popax
mov[si],al
incsi
loops3
okay:
popbx
popsi
popax
popcx
popdx
ret;数值显示的子程序定义结束
show_str:
;显示字符串的子程序已经在第一题中说明,在此不再赘述。
pushbx
pushcx
pushsi
moval,0A0h
decdh
muldh
movbx,ax
moval,2
muldl
subax,2
addbx,ax
movax,0B800h
moves,ax
movdi,0
moval,cl
movch,0
s:
movcl,ds:
[si]
jcxzok
moves:
[bx+di],cl
moves:
[bx+di+1],al
incsi
adddi,2
jmpshorts
ok:
popsi
popcx
popbx
ret
codeends
endstart
实验11编写子程序(第224页)
完整程序如下:
assumecs:
codesg
datasgsegment
db"Beginner'sAll-purposeSymbolicInstructionCode.",0
datasgends
codesgsegment
begin:
movax,datasg
movds,ax
movsi,0
callletterc
movax,4c00h
int21h
letterc:
;子程序部分[开始]
pushsi
s0:
moval,[si]
cmpal,0
jeexitsub
cmpal,61h;61h为'a'的ASCII码
jbnext
cmpal,7ah;7ah为'z'的ASCII码
janext
andal,11011111B;或使用subal,20h
mov[si],al
next:
incsi
jmpshorts0
exitsub:
popsi
ret;子程序部分[结束]
codesgends
endbegin
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 实验