汇编语言程序设计
实验报告
实验1数据传送指令
1、实验目的:了解和掌握MOV、PUSH、POP、_CHG四条指令的作用和在编程中的用法。
2、实验要求:
(Ⅰ)采用立即数寻址方式将19E0H,3F56H,0AF37H,9A81H分别送给EA_、EB_、EC_、ED_四个寄存器。
记录:操作前EA_=750A3388、EB_=7EFDE000、EC_=0、ED_=5操作后EA_=000019E0、EB_=00003F56、EC_=0000AF37、ED_=00009A81操作过程中所用到的指令:
XXX
.code
mainPROC
callDumpRegs
movea_,19E0H
moveb_,ea_
movec_,eb_
moved_,ec_
callDumpRegs
e_it
mainENDP
ENDmain
(Ⅱ)采用采用寄存器寻址方式将19E0H送给EB_、EC_、ED_三个寄存器。
记录:操作前EA_=750A3388、EB_=7EFDE000、EC_=00、ED_=013C1005操作后EA_=000019E0、EB_=000019E0、EC_=000019E0、ED_=000019E0操作过程中所用到的指令:
XXX
.code
mainPROC
callDumpRegs
movea_,19E0H
moveb_,ea_
movec_,eb_
moved_,ec_
callDumpRegs
e_it
mainENDP
ENDmain
(2)对EA_、EB_、EC_、ED_四个寄存器进行出入堆栈的操作。
(Ⅰ)将EA_、EB_、EC_、ED_四个寄存器的内容依次压入堆栈中,注意观察栈指针寄存器和堆栈内容的变化。
记录:压入EA_前ESP=003AF8E8,(ESP)=750A339A
压入EA_后ESP=003AF8E4,(ESP)=750A3388
压入EB_前ESP=003AF8E4,(ESP)=750A3388
压入EB_后ESP=003AF8E0,(ESP)=7EFDE000
压入EC_前ESP=003AF8E0,(ESP)=7EFDE000
压入EC_后ESP=003AF8DC,(ESP)=0
压入ED_前ESP=003AF8DC,(ESP)=0
压入ED_后ESP=003AF8D8,(ESP)=5
操作过程中所用到的指令:XXX
.code
mainPROC
callDumpRegs
movea_,[esp]
callDumpRegs
pushea_
callDumpRegs
pusheb_
callDumpRegs
pushec_
callDumpRegs
pushed_
callDumpRegs
e_it
mainENDP
ENDmain
(Ⅱ)将堆栈中的内容依次弹出到EA_、EB_、EC_、ED_四个寄存器,注意观察栈指针寄存器和堆栈内容的变化。
记录:弹出到EA_前ESP=003AF8D8,(ESP)=5
弹出到EA_后ESP=003AF8DC,(ESP)=0
弹出到EB_前ESP=003AF8DC,(ESP)=0
弹出到EB_后ESP=003AF8E0,(ESP)=7EFDE000
弹出到EC_前ESP=003AF8E0,(ESP)=7EFDE000
弹出到EC_后ESP=003AF8E4,(ESP)=750A3388
弹出到ED_前ESP=003AF8E4,(ESP)=750A3388
弹出到ED_后ESP=003AF8E8,(ESP)=750A339A
操作过程中所用到的指令:popea_
callDumpRegs
popeb_
callDumpRegs
popec_
callDumpRegs
poped_
callDumpRegs
e_it
mainENDP
ENDmain
(3)已知EA_=3F56H,分别利用存储器直接寻址方式和存储器间接寻址方式,将EA_寄存器的内容送到内存单元中。(Ⅰ)存储器直接寻址方式
记录:送出到EA_前EA_=00003F56,
[var]=0
送出到EA_后EA_=00003F56,
[var]=00003F56
操作过程中所用到的指令:
XXX
.data
vardword
.code
mainproc
movea_,var
calldumpregs
movea_,3f56h
calldumpregs
movvar,ea_
calldumpregs
movvar,ea_
callwritehe_
e_it
mainendp
endmain
(Ⅱ)存储器间接寻址方式
记录:送出到EA_前EA_=00003F56,
[var]=0
用于存放地址码的寄存器(esi)=0
送出到EA_后EA_=00003F56,
[var]=00003F56
操作过程中所用到的指令:
XXX
.data
vardword
.code
mainproc
movea_,3F56H
moveb_,var
calldumpregs
movesi,offsetvar
mov[esi],ea_
calldumpregs
moved_,var
e_it
mainendp
endmain
(4)已知EA_=3F56H,EC_=4690H,利用交换指令交换这两个寄存器的内容。
记录:交换前EA_=EC_=0H
交换后EA_=0H,EC_=00003F56H操作过程中所用到的指令:
XXX
.code
mainPROC
movea_,3F56H
movec_,4690H
callDumpRegs
callDumpRegs
e_it
mainENDP
ENDmain
实验二逻辑指令、跳转指令与分支程序设计
1、实验目的:了解和掌握逻辑指令、比较指令、无条件/有条件转移类指令的功能和作用,以及此类指令的使用方法。
2、实验要求:具体了解和掌握逻辑指令、比较指令、无条件/有条件转移类指令的使用和在使用时应注意的问题,学习分支型程序设计的一般方法。
(1)在DEBUG系统状态下,分别编制、调试并记录以下逻辑指令程序段的每一条指令的运行情况:
moval,41┃EA_=750A3329HAL=29Horal,20┃EA_=750A333DHAL=3DH(Ⅱ)
moval,66┃EA_=750A3342HAL=42Handal,0df┃EA_=750A3342HAL=42H(Ⅲ)
movEA_,5678┃EA_=EH_orEA_,EA_┃EA_=0H(Ⅳ)
movEA_,0ff00┃EA_=0000FF00HnotEA_┃FFFF00FFH(Ⅴ)
movEA_,1234
ZF=1OF=0
testEA_,1
ZF=1OF=0
testEA_,2
ZF=0OF=0
testEA_,4
ZF=1OF=0
testEA_,8
ZF=1OF=0
testEA_,10
ZF=0OF=0
testEA_,20
ZF=0OF=0
testEA_,40
ZF=1OF=0
┃EA_=000004D2HSF=0┃EA_=000004D2HSF=0┃EA_=000004D2HSF=0┃EA_=000004D2HSF=0┃EA_=000004D2HSF=0┃EA_=000004D2HSF=0┃EA_=000004D2HSF=0┃EA_=000004D2HSF=0
testEA_,80┃EA_=000004D2HSF=0ZF=0OF=0
test指令的作用是在源操作数和目的操作数之间进行布尔
“与”运算,但不改变目的操作数,只是设置相应的CPU标志。
(2)已知DATA单元开始存放三个带符号数,编制程序,检查三个数据是否同号,若同时为正,则在显示器上显示“+”;同时为负,则显示“-”;否则显示空格“”。
要求:分别用三组数据(同时为正,同时为负,异号)调试程序,验证程序的正确性。
XXX
.data
var1sword2
var2sword-1
var3sword3
.code
mainPROC
;三个数全部为正
RCLvar1,1;把最高位送到进位位
jcA;进位位为1,即CF为1,符号位为1负数,跳转
RCLvar2,1
RCLvar3,1
moval,'+'
callwritechar
jncD;全部为正,跳到结束
A:;三个数全部为负,此时已有var1为负RCLvar2,1
jncB;无进位位,符号为正,跳转
RCLvar3,1
jncB;如果为正则跳转
moval,'-'
callwritechar
jcD;全部为负,跳到结束
B:;另外一种情况
moval,''
callwritechar
e_it
mainENDP
ENDmain
实验三算术运算类指令、移位指令及循环程序设计
1、实验目的:了解和掌握加、减、乘、除指令的在程序设计中的用法和应注意的问题,了解和掌握移位指令的功能、作用和方法。了解和掌握循环控制类指令的功能、作用和方法。学会循环程序设计的方法。学习汇编语言输出输入语句的设计。
2、实验要求:具体了解和掌握算术类指令、移位指令和循环控制类指令的使用,以及在使用时应注意的问题,学习循环程序设计的一般方法。
(1)在DEBUG系统状态下,分别编制、调试并记录以下加、减程序段的每一条指令的运行情况,查看寄存器的结果:(Ⅰ)
MOVEA_,23┃EA_=5HEB_=7EFDE000H
MOVEB_,0CEDFH┃EA_=5HEB_=0000CEDFH
ADDEA_,EB_┃EA_=0000D834HEB_=0000CEDFH
MOVEA_,23┃EA_=5HEB_=7EFDE000H
MOVEB_,0CEDFH┃EA_=5HEB_=0000CEDFH
SUBEA_,EB_┃EA_=FFFF3A76HEB_=0000CEDFH(Ⅲ)
MOVEA_,237EFDE000H
MOVEB_,0CEDFH0000CEDFH
ADDAH,BH0000CEDFHAH=D7HBH=CEH
ADDAL,BL0000CEDFHAL=34HBL=DFH(Ⅳ)
MOVEA_,237EFDE000H
MOVEB_,0CEDFH0000CEDFH
ADDAH,BH0000CEDFHAH=D7HBH=CEH
ADCAL,BL0000CEDFHAL=34HBL=DFH
EA_=5HEB_=EA_=5HEB_=EA_=0000D755HEB_=EA_=0000D734HEB_=EA_=5HEB_=EA_=5HEB_=EA_=0000D755HEB_=EA_=0000D734HEB_=┃┃┃┃┃┃┃┃
(2)在DEBUG系统状态下,分别编制、调试并记录以下乘、除程序段的每一条指令的运行情况:
MOVAL,23┃EA_=750A3317HEB_=7EFDE000HAL=17H
MOVBL,0CEH
7EFDE0CEHBL=CEH
MULBL
7EFDE0CEH
MOVA_,23
7EFDE000H
MOVB_,0CEDFH
7EFDCEDFH
MULB_
7EFDCEDFH
MOVA_,23
7EFDE000H
MOVBL,0CEH
7EFDE0CEH
┃EA_=750A3317HEB_=┃EA_=750A1282HEB_=┃EA_=750A0955HEB_=┃EA_=750A0955HEB_=┃EA_=750A870BHEB_=┃EA_=750A0955HEB_=┃EA_=750A0955HEB_=
DIVBL┃EA_=750A7B0BHEB_=7EFDE0CEH
MOVA_,23┃EA_=750A0955HEB_=7EFDE000HED_=00C41005H
MOVD_,0856┃EA_=750A0955HEB_=7EFDE000HED_=00C40358H
MOVB_,0CEDFH┃EA_=750A0955HEB_=7EFDCEDFHED_=00C40358H
DIVB_┃EA_=750A0423HEB_=7EFDCEDFHED_=00C544D8H
(3)在DEBUG系统状态下,分别编制、调试并记录以下移位指令程序段的每一条指令的运行情况:
movEA_,420┃EA_=000001A4HshlEA_,1┃EA_=8H(Ⅱ)
movEA_,240┃EA_=000000F0HEB_=7EFDE000HEC_=0H
movcl,4┃EA_=000000F0HEB_=7EFDE000HEC_=4H
shlEA_,cl┃EA_=00000F00HEB_=7EFDE000HEC_=4H
movEA_,8000┃EA_=00001F40HEB_=7EFDE000HEC_=0H
movcl,4
7EFDE000HEC_=4H
shrEA_,cl
7EFDE000HEC_=4H
movEA_,8000
7EFDE000HEC_=0H
movcl,4
7EFDE000HEC_=4H
sarEA_,cl
7EFDE000HEC_=4H
movEA_,8086
7EFDE000HEC_=0H
movcl,4
7EFDE000HEC_=4H
rolEA_,cl
┃EA_=00001F40HEB_=┃EA_=000001F4HEB_=┃EA_=00001F40HEB_=┃EA_=00001F40HEB_=┃EA_=000001F4HEB_=┃EA_=00001F96HEB_=┃EA_=00001F96HEB_=┃EA_=0001F960HEB_=(Ⅳ)(Ⅴ)
7EFDE000HEC_=4H
movEA_,8086┃EA_=00001F96HEB_=7EFDE000HEC_=0H
movcl,4┃EA_=00001F96HEB_=7EFDE000HEC_=4H
rorEA_,cl
7EFDE000HEC_=4H
movEA_,8086
7EFDE000HEC_=0H
rclEA_,cl
7EFDE000HEC_=4H
movEA_,8086
7EFDE000HEC_=0H
movcl,4
7EFDE000HEC_=4H
rcrEA_,cl┃EA_=600001F9HEB_=┃EA_=00001F96HEB_=movcl,4┃EA_=00001F96HEB_=7EFDE000HEC_=4H┃EA_=0001F960HEB_=┃EA_=00001F96HEB_=┃EA_=00001F96HEB_=┃EA_=C00001F9HEB_=
7EFDE000HEC_=4H
rol与rcl、ror与rcr的区别在于rol和ror是将寄存器中的内容直接进行移位,而rcl和rcr是将寄存器中的内容与进位标志中的内容一起进行移位,因此参加移位的数据比原来的数据位数多一位。
(5)已知DATA单元开始存放一组无符号的字节数据,数据长度在CNT单元存放。编制程序,检查该组数据中是否存在数据100,若存在,则在显示器上显示“Y”,否则显示“N”。
XXX
.data
aydword2,100,1
cntword3
.code
mainproc
movc_,cnt
moved_,OFFSETay
moveb_,[ed_]movesi,0
mova_,0
pusha_
cmpb_,100
jeL2
moval,'N'
callWriteChar
jmpQuit
moval,'Y'callWriteCharjmpQuitquit:
popa_
adda_,4addesi,4
moveb_,[ed_+esi]
LOOPL1
e_it
mainendp
endmain
(6)编制在屏幕上显示九九表的程序。XXX
.code
mainproc
moved_,0
callcrlf
moveb_,1
inced_
pushed_
movea_,ed_
muleb_
movesi,ea_
poped_
movea_,eb_callWriteDecpushed_
moval,''callWriteCharpoped_
movea_,ed_callWriteDecpushed_moval,'='callWriteCharpoped_movea_,esicallWriteDecpushed_
moval,''callWriteCharpoped_
cmpeb_,9
jzL4
cmpeb_,ed_jzL1jbL3L3:
inceb_jmpL2L4:
callcrlfe_itmainendp
endmain
Copyright © 2019- huatuowenda.cn 版权所有
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务