汇编语言程序设计实验.docx
- 文档编号:7132441
- 上传时间:2023-01-21
- 格式:DOCX
- 页数:32
- 大小:1,003.65KB
汇编语言程序设计实验.docx
《汇编语言程序设计实验.docx》由会员分享,可在线阅读,更多相关《汇编语言程序设计实验.docx(32页珍藏版)》请在冰豆网上搜索。
汇编语言程序设计实验
实验一利用DEBUG熟悉常用指令的使用
一、实验目的
熟悉指令系统,掌握常用指令的用法;通过实验加深对各种寻址方式的理解;能熟练使用DEBUG中的命令对指令进行反汇编,观察并了解机器代码。
二、示例
请分别用一条汇编语言指令完成如下功能:
(过程略)。
1.用寄存器BX和SI的基址变址寻址方式把存储器的一个字节与AL寄存器的内容相加,并把结果送到AL中。
ADDAL,[BX][SI]
2.用位移量为0520H的直接寻址方式把存储器中的一个字与3412H相加,并把结果送回该存储单元。
ADDWORFPTR[0520H],3412H
三、实验题
1.调试、验证下列指令的结果,已知(DS)=2000H,(BX)=0100H,(SI)=0002H,(BP)=0200H,(SS)=2300H,(20100)=12H,(20101)=34H,(20102)=56H,(20103)=78H,(21200)=2AH,(21201)=4CH,(21202)=B7H,(21203)=65H,(23204)=88H,说明各指令执行完后AX寄存器的内容。
要求输入指令,相应存储单元的内容要事先设置,单步P执行,观察执行结果。
(设置存储器的值)
1.MOVAX,1200H
2.MOVAX,BX
3.MOVAX,[1200H]
4.MOVAX,[BX]
5.MOVAX,1100[BX]
6.MOVAX,[BX][SI]
7.MOVAX,1100[BX][SI]
8.MOVAX,[BP+SI+04]
2、上机调试、验证教材习题3.15。
单步执行、观察运行结果并与自己的判断进行比较。
(1)1234
(2)4321
(3)CFA0
(4)9D60
实验二汇编程序和连接程序的使用
一、实验目的。
熟悉汇编语言的上机环境,学习EDIT,MASM,LINK程序的使用,掌握建立、汇编、链接、运行汇编语言程序的过程。
二、示例。
试编写一程序,要求比较两个字符串STRING1和STRING2所含字符是否相同,若相同则显示‘MATCH’,若不相同则显示‘NOMATCH’。
用串比较功能来完成程序所要求的功能。
上机步骤如下:
1、调用EDIT.COM程序建立汇编语言源程序.ASM
建立好的源文件以EX_1.ASM为文件名存盘
DATASEGMENT
STRING1DB'VisualBasic'
STRING2DB'VisualBasic'
COUNTEQU$-STRING2
MESS1DB'MATCH!
',13,10,'$'
MESS2DB'NOMATCH!
',13,10,'$'
DATAENDS
codesegment
assumecs:
code,ds:
data,es:
data
mainprocfar
start:
:
pushds
subax,ax
pushax
movax,data
movds,ax
moves,ax
;mainprogram
movcx,count
leasi,string1
leadi,string2
cld
repzcmpsb
jzmes1movdx,offsetmess2jmpdisp0
mes1:
movdx,offsetmess1disp0:
movah,9
int21hexit:
retmainendpcodeends
endstart修改字符串,使其不同,并对以上源程序重新汇编、连接、运行,结果输出为:
NOMATCH!
修改前:
修改后:
三、实验题。
1、上机完成以上示例程序。
2、完成课堂例题,并用DEBUG运行,观察结果。
datasegment
Xdb6
Ydb?
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
moval,x
movy,5
addy,al
movah,4ch
int21h
codeends
endstart
程序:
改变后:
实验三顺序结构程序设计
一、实验目的
学习数据传送指令和算术运算指令的用法;掌握数据定义伪指令的格式,会用DEBUG中的D命令观察DB、DW、DD存储数据的格式;熟悉汇编语言的基本框架,掌握编写汇编语言程序的基本方法。
二、示例
试问如下程序执行到exit时,字单元A、B、D、D+1、D+2中的内容各是什么?
源程序如下:
datasegment
adb10
bdw20
ddb30,40,50
dataends
codesegment
assumecs:
code,ds:
data
start:
moval,data
movds,ax
moval,d+1
addal,d
mova,al
moval,d+1
addal,d+2
movb,al
addd,10
addd+1,20
addd+2,30
exit:
movah,4ch
int21h
codeends
endstart
阅读以上程序,运行程序并用debug调试分析出结果。
字单元A:
4C5A。
字单元B:
2B5A。
字单元D:
3C2B。
字单元D+1:
503C。
字单元D+2:
0050。
三、实验题
1、求表达式Y=A*X2+B*X+C的值,已知A、B、C分别存放在DATAA、DATAB、DATAC字节单元,X存放在TABL字节单元,结果Y放入RESULT字单元。
要求:
①在DEBUG下多次修改X的值,观察执行结果Y;
②修改原程序,从键盘上输入X的值,观察执行结果Y。
(见书P471)
①datasegment
dataadb1
databdb3
datacdw5
tabldb7
resultdw?
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
moval,tabl
mulal
muldataa
movbx,ax
moval,tabl
muldatab
addax,bx
addax,datac
movresult,ax
exit:
movah,4ch
int21h
codeends
endstart
运行结果为16进制的4B,即75,计算正确。
在修改X值为9后,运算结果为71,即113,计算正确。
继续修改X值为3,运行结果为17,即23,计算正确。
②datasegment
dataadb1
databdb3
datacdw5
tabldb?
resultdw?
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movah,01
int21h
subal,30h
movtabl,al
mulal
muldataa
pushax
moval,tabl
muldatab
popbx
addax,bx
addax,datac
movresult,ax
exit:
movah,4ch
int21h
codeends
endstart
从键盘上输入X值为7,输出结果为4B。
2、上机完成教材习题3.11(P108),写出正确结果。
datasegment
tabledw10,20,30,40,50
entrydw3
dataends
codesegment
ASSUMEDS:
data,cs:
code
start:
movax,data
movds,ax
movbx,offsettable
addbx,entry
movax,[bx]
codeends
endstart
AX=1E00H。
四、实验报告
写出程序清单,记录运行结果;总结DEBUG中U、E、D、T、G命令的功能。
U命令的功能:
将主存内容按照机器代码形成汇编指令显示;
E命令的功能:
用于修改主存内容;
D命令的功能:
显示主存单元的内容;
T命令的功能:
每执行一条指令就显示运行结果;
G命令的功能:
从指定地址处开始运行程序,直到遇到断点或者程序正常结束。
实验四循环结构程序设计
一、实验目的
理解单重循环与多重循环程序的结构及执行过程;掌握循环控制指令的用法,会使用数据串操作指令编程;熟练掌握循环结构程序的设计方法和利用设置断点调试程序的方法。
二、示例
1、单循环程序
已知当前数据段中DADT1和DADT2开始分别存放若干字节数据,数据个数相同,编制程序检查两数据块中数据是否相同,若相同,则在屏幕上显示1,否则显示0。
【参考程序如下】
DSEGSEGMENT;定义段。
DATA1DB'ABCDEFG3';定义字符串赋值给变量。
DATA2DB'ABCDEF3G';定义字符串赋值给变量。
CNTDW8;定义变量。
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG;赋值。
MOVDS,AX
MOVDL,31H;赋值。
LEASI,DATA1;取变量的偏移地址。
LEADI,DATA2;取变量的偏移地址、首地址。
MOVCX,CNT
DECSI;SI自减。
DECDI;DI自减。
AGAIN:
INCSI;自增。
INCDI;进行比较。
MOVAL,[SI];地址的内容赋值给AL。
CMPAL,[DI];进行比较。
LOOPZAGAIN;如果相等,循环到AGAIN。
JZDISP;若相等,则跳转到显示。
DECDL;DL自减。
DISP:
MOVAH,2;赋值。
INT21H;中断语句。
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
输入相同数据时:
DSEGSEGMENT;定义段。
DATA1DB'ABCDEFGG';定义字符串赋值给变量。
DATA2DB'ABCDEFGG';定义字符串赋值给变量。
CNTDW8;定义变量。
DSEGENDS
CSEGSEGMENT
ASSUMECS:
CSEG,DS:
DSEG
START:
MOVAX,DSEG;赋值。
MOVDS,AX
MOVDL,31H;赋值。
LEASI,DATA1;取变量的偏移地址。
LEADI,DATA2;取变量的偏移地址、首地址。
MOVCX,CNT
DECSI;SI自减。
DECDI;DI自减。
AGAIN:
INCSI;自增。
INCDI;进行比较。
MOVAL,[SI];地址的内容赋值给AL。
CMPAL,[DI];进行比较。
LOOPZAGAIN;如果相等,循环到AGAIN。
JZDISP;若相等,则跳转到显示。
DECDL;DL自减。
DISP:
MOVAH,2;赋值。
INT21H;中断语句。
MOVAH,4CH
INT21H
CSEGENDS
ENDSTART
三、实验题
课堂实验内容:
教材习题5.2,习题5.17。
5.2:
DATASSEGMENT;输入数据段代码。
DATASENDS
STACKSSEGMENT;输入堆栈段代码。
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS;定义段。
START:
MOVAX,DATAS
MOVDS,AX
MOVCX,2;定义循环次数。
MOVAH,1;中断,从键盘输入字符。
INT21H
MOVDL,AL;把AL赋值给DL。
DECDL;DL自减。
MOVAH,2;中断指令,显示单个字符。
INT21H
S:
INCDL;自增1,CX自减1,CX不为0则继续循环。
MOVAH,2
INT21H
DECCX
JNZS;输入代码段代码。
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
输入k,前导字符j,后续字符l,输出jkl,正确。
5.17:
DATASSEGMENT;输入数据段代码。
MEMDB4DUP(?
);定义数组。
DATASENDS
STACKSSEGMENT;输入堆栈段代码。
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVAX,2A49H;给AX赋值。
LEABX,MEM;把数组MEM的首地址赋值给BX。
MOVCH,4;给CH赋值。
即循环次数。
S:
MOVDX,AX;把AX的值赋给DX。
MOVCL,4;给CL赋值。
即移位位数。
ANDDX,000FH;相与,取出最低位。
ADDDX,30H
CMPDX,3AH
JLNEXT;如果小于则跳转到NEXT。
ADDDX,07H;如果大于就把DX加7。
NEXT:
MOV[BX],DX;把DX赋值给BX下地址的内容,即数组。
INCBX;BX自增1。
RORAX,CL;将AX循环右移CL位。
DECCH;CH自减。
JNZS;如果不为0则跳转。
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验五分支结构程序设计
一、实验目的
掌握条件转移指令的使用方法及指令对标志寄存器中各标志位的影响;掌握标志位和转移指令之间的关系;会用条件转移指令和无条件转移指令设计多分支结构程序;掌握设置断点调试程序的方法。
二、示例
简单分支结构
判断方程ax2+bx+c=0是否有实根,若有实根则将字节变量tag置1,否则置0(假设a、b、c均为字节变量,表达-127~+127的数据)。
当a=1,b=3,c=1时有实根。
程序如下:
运行结果如下:
当a=1,b=1,c=1时有实根。
程序如下:
三、实验题
(1)教材习题5.21。
程序如下:
datasegment
arraydwx,y,z
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movcx,0
movsi,0
movdi,2
callbj
movsi,0
movdi,4
callbj
movsi,2
movdi,4
callbj
cmpcl,3
jnzshow
movcl,2
show:
addcx,30h
movah,02h
movdl,cl
int21h
movah,4ch
int21h
bj:
movax,ds:
array[si]
movbx,ds:
array[di]
cmpax,bx
jzxd
ret
xd:
inccx
ret
codeends
endstart
1三个数都相等时的运行结果:
2三个数中有两个数相等的运行结果:
3三个数都不相等时的运行结果:
(2)已知DATAX和DATAY单元各存放一个带符号字节数据,从键盘上接收加(+)、减(-)、乘(*)或除(/)符号,然后完成相应运算,结果存入RLT单元。
程序如下:
datasegment
dataxdb4h
dataydb5h
rltdb1dup(?
)
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movbl,datax
movbh,datay
movah,01h
int21h
cmpal,'+'
jejiafa
cmpal,'-'
jejianfa
cmpal,'*'
jechf
cmpal,'/'
jechufa
chufa:
moval,bl
subah,ah
divbh
movbl,al
jmpq5
chf:
moval,bh
mulbl
movbl,al
jmpq5
jianfa:
subbl,bh
jmpq5
jiafa:
addbl,bh
q5:
moval,bl
movcl,4
shral,cl
addal,30h
cmpal,39h
jbexianshi1
addal,07h
xianshi1:
movdl,al
movrlt,al
movah,02h
int21h
moval,bl
andal,0fh
addal,30h
cmpal,39h
jbexianshi2
addal,07h
xianshi2:
movdl,al
movrlt,al
movah,02h
int21h
movah,4ch
int21h
codeends
endstart
运行结果:
1加:
2减:
3乘:
4除:
实验六子程序设计
一、实验目的
掌握子程序的设计方法;理解子程序调用与返回指令的执行过程及堆栈的变化情况;掌握子程序调用过程中主程序与子程序间的参数传递方式,掌握现场的保护与恢复方法,会编制嵌套子程序。
二、实验题
1、上机验证教材例6.3十进制到十六进制数的转换,仿照示例进行调试。
decihexsegment
assumecs:
decihex
mainprocfar
repeat1:
calldecibin
callcrlf
callbinihex
callcrlf
jmprepeat1
mainendp
decibinprocnear
movbx,0
newchar:
movah,1
int21h
subal,30h
jlexit
cmpal,9d
jgexit
cbw
xchgax,bx
movcx,10d
mulcx
xchgax,bx
addbx,ax
jmpnewchar
exit:
ret
decibinendp
binihexprocnear
movch,4
rotate:
movcl,4
rolbx,cl
moval,bl
andal,0fh
addal,30h
cmpal,3ah
jlprintit
addal,7h
printit:
movdl,al
movah,2
int21h
decch
jnzrotate
ret
binihexendp
crlfprocnear
movdl,0dh
movah,2
int21h
movdl,0ah
movah,2
int21h
ret
crlfendp
decihexends
endmain
2、教材习题6.7。
datassegment
cjdb76,69,84,90,73,88,99,63,100,80
s6db0
s7db0
s8db0
s9db0
s10db0
datasends
codessegment
assumecs:
codes,ds:
datas
start:
movax,datas
movds,ax
leasi,cj;目标地址传送指令
movcx,10;循环十次
s:
;(子程序部分)
moval,[si]
cbw
movbl,10
divbl;取个位数
subal,6
movbl,al
movbh,0
incs6[bx];加1指令,跳转到下一个地址里面
incsi
loops;对子程序进行循环
movah,4ch
int21h
codesends
endstart
堆栈指针和栈顶由inc加1指令,跳转到下一个地址里面,从而使程序进行了循环运算。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编语言 程序设计 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)