汇编实验题Word格式文档下载.docx
《汇编实验题Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汇编实验题Word格式文档下载.docx(19页珍藏版)》请在冰豆网上搜索。
![汇编实验题Word格式文档下载.docx](https://file1.bdocx.com/fileroot1/2023-1/2/04cf6311-f233-4e9d-8fdf-180802d96f50/04cf6311-f233-4e9d-8fdf-180802d96f501.gif)
(3)下面的程序的功能是将“movax,4c00h”之前的指令复制到内存0:
200处,补全程序。
上机调试,跟踪运行结果。
code
codesegment
movax,code;
code为所填写的数据
moves,ax
movcx,18h;
18h为所填写的数据
moval,[bx]
moves:
[bx],al
codeends
dw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
start:
movax,0
movcx,8
movax,[bx]
movcs:
[bx],ax;
此条指令为所填指令
addbx,2
endstart
(2)
dw0,0,0,0,0
movax,cs;
cs为所填第一空
movss,ax
movsp,1ah;
此条指令为所填第二空
push[bx]
popcs:
[bx];
此条指令为所填第三空
实验5编写、调试具有多个段的程序(第123页)
1.保持不变
2.<
考虑不同机子环境不同,答案无法统一>
3.X-2,X-1
4.(N/16+1)*16[说明:
N/16只取整数部分]
(3)
3.X+3,X+4
(5)完整程序如下:
asegment
db1,2,3,4,5,6,7,8
aends
bsegment
bends
csegment
db0,0,0,0,0,0,0,0
cends
start:
movax,a
movax,c
s1:
movax,es:
[bx]
add[bx],ax
loops1
movax,b
s2:
loops2
endstart
(6)完整程序如下:
dw1,2,3,4,5,6,7,8
dw0,0,0,0,0,0,0,0
movsp,10h
movax,a
实验6实践课程中的程序(第147页)
(2)编程:
完成问题中的程序。
问题7.9完整程序如下:
codesg,ss:
stacksg,ds:
datasg
stacksgsegment
stacksgends
datasgsegment
db'
1.display'
2.brows'
3.replace'
4.modify'
datasgends
movax,stacksg
movsp,16
movax,datasg
movcx,4
;
外循环
pushcx
movsi,3
s0:
内循环
moval,[bx+si]
andal,11011111b
mov[bx+si],al
incsi
loops0
addbx,16
popcx
loops
movax,4c00h
int21h
实验7寻址方式在结构化数据访问中的应用(第160页)
完整程序如下:
codesg,ds:
data,es:
table
datasegment
1975'
'
1976'
1977'
1978'
1979'
1980'
1981'
1982'
1983'
1984'
1985'
1986'
1987'
1988'
1989'
1990'
1991'
1992'
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
movax,data
movax,table
movsi,0
movdi,0
movcx,21
s:
进入循环
[di],al
moval,[bx+1]
[di+1],al
moval,[bx+2]
[di+2],al
moval,[bx+3]
[di+3],al
以上8句的作用是存放年份
movax,54h[bx];
第一个'
年收入'
的段基址为54H
movdx,56h[bx]
5h[di],ax
7h[di],dx
以上4句的作用是存放公司总收入
movax,0A8h[si];
人数'
的段基址为0A8H
0Ah[di],ax
以上2句是存放公司的人数
movax,54h[bx]
divwordptrds:
0A8h[si]
0dh[di],ax
以上3句是存放人均收入
addbx,4
addsi,2
adddi,16
以上3句是为下一次循环时存放数据做准备
3个寄存器递增的速度决定了所要存取的数据的位置的偏移地址
loops;
跳到标号s处
实验8分析一个奇怪的程序(第174页)分析下面的程序,在运行前思考:
这个程序可以正确返回吗?
运行后再思考:
为什么是这种结果?
通过这个程序加深对相关内容的理解。
nop
nop
movdi,offsets
movsi,offsets2
movax,cs:
[si]
[di],ax
s0:
jmpshorts
s1:
s2:
jmpshorts1
程序可以正常返回。
详细分析:
在此题中较为深入地考察了‘段内直接短转移’[形如:
jmpshort标号]的概念。
我们知道程序中:
movdi,offsets
movsi,offsets2
movax,cs:
movcs:
实验9根据材料编程(第175页)
code,ds:
data,ss:
stack
welcometomasm!
'
定义要显示的字符串(共16字节)
db02h,24h,71h;
定义三种颜色属性
dataends
stacksegment
dw8dup(0)
stackends
movax,stack
movax,0b872h;
算出屏幕第12行中间的显存的段起始位置放入ax中
movcx,3;
外循环为3次,因为要显示三个字符串
s3:
pushcx;
三个进栈操作为外循环s3保存相关寄存器的值
pushax;
以防止它们的值在内循环中被破坏
pushdi
moves,ax;
此时es为屏幕第12行中间的显存的段起始位置
movcx,10h;
内循环为10h次,因为一个字符串中含10h个字节
moval,ds:
[bx+si]
[bx+di],al
adddi,2
loops1;
此循环实现偶地址中存放字符
movsi,1;
si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备
popdi;
将di的值恢复成进入内循环之前的时候的值
10h[bx+di];
取颜色属性[源OP寻址方式:
相对基址变址]
第二个内循环也为10h次
[bx+si],al
loops2;
此循环实现奇地址中存放字符的颜色属性
以下4句为下一趟外循环做准备
incdi
popax
addax,0ah;
将显存的段起始地址设为当前行的下一行
[在段地址中加0ah,相当于在偏移地址中加了0a0h(=160d)]
loops3
实验10编写子程序(第194页)
1.显示子程序
Welcometomasm!
0
assumecs:
data
movdh,1;
dh装行号(范围:
1--25)
movdl,1;
dl装列号(范围:
1--80)[注:
每超过80等于行号自动加1]
movcl,0cah;
cl中存放颜色属性(0cah为红底高亮闪烁绿色属性)
callshow_str
int21h
show_str:
显示字符串的子程序[定义开始]
pushsi
moval,0A0h
decdh;
行号在显存中下标从0开始,所以减1
muldh
movbx,ax
moval,2
muldl
subax,2;
列号在显存中下标从0开始,又因为偶字节存放字符,所以减2
addbx,ax;
此时bx中存放的是行与列号的偏移地址
movax,0B800h
es中存放的是显存的第0页(共0--7页)的起始的段地址
moval,cl
movch,0
movcl,ds:
jcxzok
[bx+di],cl;
偶地址存放字符
[bx+di+1],al;
奇地址存放字符的颜色属性
ok:
popsi
ret;
显示字符串的子程序[定义结束]
2.解决除法溢出的问题(第197页)
code,ss:
movax,4240h
movdx,0fh
movcx,0ah
calldivdw
divdw:
;
子程序定义开始
pushax
movax,dx
movdx,0
divcx
movcx,dx
movdx,bx
子程序定义结束
3.数值显示(第198页)
db10dup(0)
movax,12666
movbx,data
movds,bx
calldtoc
movdh,8
movdl,3
movcl,0cah
dtoc:
数值显示的子程序定义
pushdx
pushbx
movcx,10d
divcx
movcx,ax
jcxzs2
adddx,30h
incbx;
再进行一次栈操作(补充当"
商为零而余数不为零"
时的情况)
movcx,bx
mov[si],al
loops3
okay:
popbx
popdx
数值显示的子程序定义结束
显示字符串的子程序已经在第一题中说明,在此不再赘述。
decdh
subax,2
addbx,ax
[bx+di],cl
[bx+di+1],al
ret
实验11编写子程序(第224页)
db"
Beginner'
sAll-purposeSymbolicInstructionCode."
begin:
callletterc
letterc:
子程序部分[开始]
moval,[si]
cmpal,0
jeexitsub
cmpal,61h;
61h为'
a'
的ASCII码
jbnext
cmpal,7ah;
7ah为'
z'
janext
andal,11011111B;
或使用subal,20h
next:
jmpshorts0
exitsub:
子程序部分[结束]
endbegin