汇编上机讲义.docx
- 文档编号:26635875
- 上传时间:2023-06-21
- 格式:DOCX
- 页数:28
- 大小:23.14KB
汇编上机讲义.docx
《汇编上机讲义.docx》由会员分享,可在线阅读,更多相关《汇编上机讲义.docx(28页珍藏版)》请在冰豆网上搜索。
汇编上机讲义
汇编语言实验讲义
魏祖雪
物电学院
2007.5
、
实验一熟悉汇编语言使用环境
一、实验目的:
1、熟悉汇编语言的编辑、汇编、连接、运行的全过程。
2、了解汇编语言的程序结构、学习调用过程实现输入输出及用INCLUDE命令包含文件的方法。
3、算术运算类操作实验
二、实验内容和步骤:
1、汇编语言源程序要运行的四个步骤:
(1)用编辑软件EDIT或记事本编辑一个扩展文件名为ASM的汇编语言源程序。
(2)用汇编程序MASM或TASM汇编上述的汇编语言源程序,形成目标代码文件。
(扩展名为OBJ)
(3)用连接程序LINK或TLINK连接目标代码文件,形成可执行文件。
(扩展名为EXE)
(4)运行可执行文件。
观察执行结果,以验证其正确性。
2、从键盘上输入两个十进制数正数(<32767),相加并显示结果。
参考程序:
.modeltiny
.stack256
.CODE
START:
CALLread;从键盘接受一个十进制数
MOVAX,BX
calldpcrlf
CALLread;从键盘接受一个十进制数
ADDbx,aX
calldpcrlf;回车换行
CALLwrite;显示结果
.exit0
INCLUDEout_B_D.ASM;把二进制转换为十进制数输出过程:
write
INCLUDEin_D_B.ASM;把二进制转换为十进制数输入过程:
read
ENDSTART
3.改写程序为输入两个十进制数,相减并显示输出。
4.改写程序为输入两个十进制数,相乘并显示输出。
5.改写程序为输入两个十进制数,相除并显示输出。
(注:
例4.27read:
十进制—>二进制转换过程,出口参数BX=二进制数;例P4.28,write:
二进制—>十进制转换过程,入口参数BX=二进制数,dpcrlf:
回车换行)
三、记录结果与分析:
(截图并打印在实验报告上)
四、实验中遇到的问题和解决的步骤、方法
五、实验改进与思考
补充实验:
BCD->ASCII实验
1.实验目的:
(1)进一步熟悉汇编语言的汇编、连接、运行的全过程。
(2)了解汇编语言的程序结构、掌握BCD—>ASCII及字符输出的方法。
2.实验步骤:
(同前)
3.实验参考程序:
NAMEBCDTOASCII
DATASEGMENT
BCDBUFDB12H,34H,56H,78H,90H,98H,76H,54H,32H,10H
COUNTEQU$-BCDBUF
ASCBUFDB20DUP(?
)
DATAENDS
STACKSEGMENTPARASTACK‘STACK’
SPACEDB100DUP(?
)
TOPDW?
STACKENDS
COSEGSEGMENT
ASSUMECS:
COSEG,DS:
DATA,ES:
DATA,SS:
STACK
MAINPROCFAR
START:
PUSHDS
MOVAX,0
PUSHAX
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVAX,STACK
MOVSS,AX
MOVSP,OFFSETTOP
MOVSI,OFFSETBCDBUF
MOVDI,OFFSETASCBUF
MOVCX,COUNT
CLD
TRANT:
LODSB
MOVBL,AL
PUSHCX
MOVCL,4
SHRAL,CL
ORAL,30H
STOSB
MOVAH,2
MOVDL,AL
INT21H
MOVAL,BL
ANDAL,0FH
ADDAL,30H
STOSB
MOVAH,2
MOVDL,AL
INT21H
POPCX
LOOPTRANT
RET
MAINENDP
COSEGENDS
ENDSTART
4.修改程序,在输出的每个数据后加一个逗号,重新调试运行之。
实验二分支程序设计
实验目的:
1、掌握利用间接转移指令JMPBX实现多岔分枝的方法。
2、宏替换指令MACRO及ENDM。
3、符号扩展指令CBW。
实验程序:
dispmacromsg
leadx,msg
movah,9
int21h
movah,4ch
int21h
endm
stacksegmentstack
db256dup(0)
stackends
datasegment
parmdb16dup(?
)
brtabledwoffsetbra,offsetbrb,offsetbrc
dwoffsetbrd,offsetbre,offsetbrf
msgadb'IlikemyIBM-PC!
$'
msgbdb'Howareyou!
$'
msgcdb'NibaoCollege$'
msgddb'Thisisasample$'
msgedb'Wellcomeusemycoputer!
$'
msgfdb'Theassemderlanguageof8088$'
errmsdb'Error!
!
invalidparameter!
!
$'
dataends
codesegment
assumecs:
code,ds:
data,ss:
stack
start:
movax,data
moves,ax
movsi,80h
leadi,parm
movcx,16
cld
repmovsb
movds,ax
cmpparm,2
jcerr
moval,parm+2
subal,30h
jcerr
cmpal,6
jncerr
leabx,brtable
cbw
addax,ax
addbx,ax
jmp[bx]
err:
disperrms
bra:
dispmsga
brb:
dispmsgb
brc:
dispmsgc
brd:
dispmsgd
bre:
dispmsge
brf:
dispmsgf
codeends
endstart
实验步骤:
1、输入并汇编此程序。
要求生成一个.LST文件。
用TYPE命令检查.LST文件,观察宏替换命令产生的指令集。
2、将OBJ文件连接成EXE文件(假设为AA。
EXE)。
3、用命令DEBUGAA.EXEXXX(XXX为任意字符串)将AA.EXE带参数调入DEBUG用D命令观察DS:
0080处的命令行,记录80H处的内容和字符个数的关糸。
4、退出DEBUG。
直接带参数运行此程序:
AAn(n=0--5)
依次观察并记录n从0到5时的运行结果。
补充实验:
条件转移指令
实验目的:
通过实验掌握下列知识:
1、8088指令:
JZ,JNZ,JC,JNC,CMP,SHR。
2、程序:
用字符搜索法确定字符串长度。
3、程序:
16进制数化为ASCII码的一般方法。
实验内容及步骤:
一、用字符搜索法确定字符串长度:
1、用A命令在100H开始的内存处键入下列程序:
JMPSTART
DB'Thisistheprogramtomeasure'
DB'thelengthofastring!
$'
START:
MOVBX,102
MOVAL,24
XORCL,CL
LOP:
CMPAL,[BX]
JZEXIT
INCBX
INCCL
JMPLOP
EXIT:
INT3
2、用G命令运行此程序,并检查CL的统计长度是否与你自己统计的实际长度是否一样?
二、16进制数化ASCII码的一般方法(显示内存内容)
1、用A命令在100H处键入下列程序:
MOVSI,0
MOVBL,10
LOP:
MOVDL,[SI]
MOVCL,4
SHRDL,CL
CMPDL,0A
JCJ1
ADDDL,7
J1:
ADDDL,30
MOVAH,2
INT21
MOVDL,[SI]
ANDDL,0F
CMPDL,0A
JCJ2
ADDDL,7
J2:
ADDDL,30
MOVAH,2
INT21
MOVDL,20
MOVAH,2
INT21
INCSI
DECBL
JNZLOP
INT20
2、用N,W命令将此程序用CC.COM文件名存入磁盘。
3、用Q命令退出DEBUG。
4、在DOS命令状态下直接运行CC.COM命令文件,应在屏幕上显示出内存从0000H开始的16个字节的内容,若有错误,用DEBUG检查之。
5、自编程序:
修改上面程序,使除以16进制数形式显示内存内容外,还能在其右边显示该16进制码所对应的ASCII字符,07-0D的控制字符用'.'代替。
三、综合程序(选做):
测量一字符串长度,并用16进制数显示之
程序:
JMPSTART
DB'Thisisaprogramtomeasurethelengthofastring。
'
DB0D,0A
DB'thelengthofthestringis:
$'
START:
MOVAH,9
MOVDX,102
INT21
MOVBX,101
MOVAL,'$'
MOVDH,FF
LOP:
INCBX
INCDH
CMPAL,[BX]
JNZLOP
MOVCH,2
MOVCL,4
LOP1:
ROLDH,CL
MOVDL,DH
ANDDL,0F
ADDDL,30
CMPDL,3A
JCJ
ADDDL,7
J:
MOVAH,2
INT21
DECCH
JNZLOP1
INT20
键入此程序,存入?
?
?
.COM文件中并在DOS命令状态下直接运行之,若未出现预期结果,用DEBUG检查有否错误?
实验二分支多重循环程序
实验目的:
1、掌握多重循环程序和排序程序设计方法。
2、掌握带符号数的比较转移指令:
JL,JLE,JG,JGE
3、伪指令EQU及操作符'$'的使用。
4、COM文件的要求和生成过程。
程序:
codesegment
org100h
assumecs:
code,ds:
code
main:
jmpstart
arraydw1234h,5673h,7fffh,8000h,0dffh
dw0ab5h,0369h,005fh,5634h,9069h
countequ$-array
start:
movcx,count
shrcx,1
deccx
movbl,-1
again:
movdx,cx
andbl,bl
jeexit
xorbl,bl
xorsi,si
again1:
movax,array[si]
cmpax,array[si+2]
jlenchg
xchgarray[si+2],ax
movarray[si],ax
movbl,-1
nchg:
incsi
incsi
decdx
jnzagain1
loopagain
exit:
int20h
codeends
endmain
实验步骤:
1、输入,汇编并连接此程序。
忽略连接时的无堆栈告警。
2、用EXE2BIN将.exe文件转换为。
COM文件,命令格式:
EXE2BIN?
?
?
?
.EXE?
?
?
?
.COM
3、在DEBUG下运行此程序,记录运行结果。
4、将转移指令JLE改为JBE,JGE和JAE,分别运行并记录排序结果。
实验三子程序
实验目的:
1、掌握利用堆栈传递参数的子程序调用方法。
2、掌握子程序递归调用方法。
3、过程调用伪指令:
PROC,ENDP,NEAR和FAR。
4、8088指令:
CALL,RET,RETn。
5、利用RET指令退出EXE文件的方法。
实验内容及步骤:
一、利用堆栈传递参数的子程序调用。
(求累加和)
程序:
stacksegmentstack
db256dup(0)
stackends
datasegment
ary1db1,2,3,4,5,6,7,8,9,10
count1equ$-ary1
sum1dw?
ary2db10,11,12,13,14,15,16,17,18
count2equ$-ary2
sum2dw?
dataends
mainsegment
assumecs:
main,ds:
data,ss:
stack
startprocfar
pushds
xorax,ax
pushax
movax,data
movds,ax
movax,count1
pushax
leaax,ary1
pushax
callfarptrsum
movax,count2
pushax
leaax,ary2
pushax
callfarptrsum
ret
startendp
mainends
procesegment
assumecs:
proce
sumprocfar
movbp,sp
movcx,[bp+6]
movbx,[bp+4]
xorax,ax
adn:
addal,[bx]
adcah,0
incbx
loopadn
mov[bx],ax
ret4
sumendp
proceends
endstar
步骤:
1、输入,汇编并将此程序连接成EXE文件。
2、用DEBUG的断点命令和T命令运行此程序,观察并记录每次过程调用及进出
栈指令前后(带';'的语句)的SP和堆栈内容。
3、记录最后结果:
SUM1,SUM2的段及偏移地址和它们的内容。
二、子程序递归调用(求阶乘)。
程序:
stacksegmentstack
db100hdup(?
)
stackends
datasegment
resuldw?
dataends
codesegment
mainprocfar
assumecs:
code,ds:
data,ss:
stack
start:
pushds
subax,ax
pushax
movax,data
movds,ax
movax,5
callfact
movresul,ax
ret
factproc
andal,al
jneiia
moval,1
ret
iia:
pushax
decal
callfact
x2:
popcx
mulcl
ret
factendp
mainendp
codeends
endstart
步骤:
1、将程序输入,汇编并连接成EXE文件。
2、用DEBUG的断点和T命令检查并记录每层递归嵌套过程的堆栈和AL内容。
3、修改源程序,将阶乘数3改为本程序的最大允许值(是多少?
),重新汇编连接之。
用DEBUG运行并记录RESUL单元内容。
4、若要在DOS命令下直接运行并显示阶乘结果(16进制形式),试修改程序并
调试运行。
实验四算术运算处理
1.实验目的:
练习用汇编语言实现对数据块的求和、求最大值(或最小值)、排序等程序设计方法。
2.求给定的十个未压缩的BCD码数之和并将结果显示在屏幕上。
参考程序:
NAMESUMTODECIMAL
DATASEGMENT
BCDBUFDB0,1,2,3,4,5,6,7,8,9
SUMDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
DISPMACRO
ORDL,30H
MOVAH,2
INT21H
ENDM
START:
MOVAX,DATA
MOVDS,AX
MOVSI,0
MOVCX,10
XORAX,AX
CIR0:
ADDAL,BCDBUF[SI]
AAA
INCSI
LOOPCIR0
MOVSUM,AX
MOVDL,AH;先输出高位
DISP
MOVDL,AL;再输出低位
DISP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
3.将BCDBUF数据区的BCD码数改成带符号字数据,编制这些数比较大小的程序,并调用输出子程序显示结果。
4.将上题中BCDBUF数据区的带符号数按从小到大顺序排序,并将排序后的数据输出。
实验五字符串处理
1.实验目的:
练习用汇编语言实现对字符串拷贝、比较、大小写转换、求长度、查找、插入、删除的方法。
2.对给定的字符串长度,并将结果输出。
参考程序:
DATASEGMENT
STRBUFDB‘Thesooner,thebetter!
’,0
STRLENDW?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDI,OFFSETSTRBUF
MOVAX,0
CRI0:
CMPBYTEPTR[DI],0
JZEXIT
INCAX
INCDI
JMPCRI0
LOOPCRI0
EXIT:
MOVSTRLEN,AX
CALLB_DP
MOVAH,4CH
INT21H
INCLUDEBIN_DEC.ASM
CODEENDS
ENDSTART
3.编程实现在给定的字符串中删除一字符,删除后显示该字符串。
4.编程实现在给定的字符串(已排序)中插入一字符,插入后重新显示该字符串长度。
5.编制字符串拷贝子程序。
再编制主程序调用该子程序拷贝给定的字符串,然后输出其字符串。
实验六有关输入/输出的功能调用
1.实验目的:
使用DOS提供的有关输入/输出的系统功能调用,练习字符串的输入(键盘)/输出(显示)。
2.参考程序
DATASEGMENT
STRBUFDB‘Pleaseinputastring:
’,’$’
KEYLENDB64
KEYNUMDB?
KEYBUFDW64DUP(?
)
DATAENDS
STACKSEGMENT
DB100DUP(0)
TOPDW?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVSP,OFFSETTOP
LEADX,STRBUF
MOVAH,9
INT21H;显示一个字符串
LEADX,KEYLEN
MOVAH,0AH
INT21H;从键盘接受一个字符串
CALLCRLF;输出回车换行
MOVBL,KEYNUM;得到实际输入的字符数
MOVBH,0
ADDBX,DX
MOVBYTEPTR[BX],’$’;在字符串末尾添一个‘$’
MOVAH,9
INT21H;显示从键盘接受的字符串
CALLCRLF
MOVAH,4CH
INT21H
CRLFPROCNEAR
PUSHAX
PUSHDX
MOVDL,0DH
MOVAH,2
INT21H
MOVDL,0AH
MOVAH,2
INT21H
POPDX
POPAX
RET
CRLFENDP
CODEENDS
ENDSTART
3.编程实现从键盘接受一个字符串,再从键盘接受一查找的字符(例如’g’),找到时提示’Yes,found!
’,找不到时提示’Nofound!
’。
4.信息检索:
已知有10组等长字符串,编程实现当用户输入0—9之间的任一数字时,输出对应的字符串。
补充实验:
文件操作
1.实验目的:
(1)了解文件的建立、打开、读、写、关闭等操作的方法。
(2)与基本I/O方法配合,利用DOS系统功能调用完成对文件的操作。
2.在E盘上建立一新文件,并将从键盘上输入的数据写到盘上。
参考程序:
DATASEGMENT
FILENAMEDB‘exam.asc’,0
HANDDLEDW?
CREATERRDB‘createthefileerror’,’$’
WRITERRDB‘writethefileerror’,’$’
STRBUFDB‘Pleaseinputastring:
’,’$’
KEYLENDB64
KEYNUMDB?
KEYBUFDW64DUP(?
)
DATAENDS
STACKSEGMENT
DB100DUP(0)
TOPDW?
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAX,STACK
MOVSS,AX
MOVSP,OFFSETTOP
LEADX,FILENAME
MOVCX,0
MOVAH,3CH
INT21H;建立一个文件
LEADX,CREATERR
JCDISPERR;失败,显示出错后返回
MOVHANDLE,AX;否则,成功,将文件号保存
LEADX,STRBUF
MOVAH,9
INT21H;显示提示信息
LEADX,KEYLEN
MOVAH,0AH
INT21H;从键盘接受一个字符串(文件内容)
MOVCL,KEYNUM;得到实际输入的字符数
MOVCH,0
MOVBX,HANDLE
MOVAH,40H
INT21H
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 上机 讲义