(附录二)汇编语言程序设计实验报告实验1 数据传送指令1、实验目的:了解和掌握 MOV、PUSH、POP、XCHG四条指令的作用和在编程中的用法。
2、实验要求:(Ⅰ)采用立即数寻址方式将19E0H,3F56H,0AF37H,9A81H 分别送给EAX、EBX、ECX、EDX四个寄存器。
记录:操作前 EAX= 750A3388 、 EBX= 7EFDE000 、 ECX= 00000000 、 EDX= 01361005操作后 EAX= 000019E0 、 EBX= 00003F56 、 ECX= 0000AF37 、 EDX= 00009A81操作过程中所用到的指令:INCLUDE Irvine32.inc.codemain PROCcall DumpRegsmov eax,19E0Hmov ebx,eaxmov ecx,ebxmov edx,ecxcall DumpRegsexitmain ENDPEND main(Ⅱ)采用采用寄存器寻址方式将19E0H送给EBX、ECX、EDX 三个寄存器。
记录:操作前 EAX= 750A3388 、 EBX= 7EFDE000 、 ECX= 000000000 、 EDX= 013C1005操作后 EAX= 000019E0 、 EBX= 000019E0 、 ECX= 000019E0 、 EDX= 000019E0操作过程中所用到的指令:INCLUDE Irvine32.inc.codemain PROCcall DumpRegsmov eax,19E0Hmov ebx,eaxmov ecx,ebxmov edx,ecxcall DumpRegsexitmain ENDPEND main(2)对EAX、EBX、ECX、EDX四个寄存器进行出入堆栈的操作。
(Ⅰ)将EAX、EBX、ECX、EDX四个寄存器的内容依次压入堆栈中,注意观察栈指针寄存器和堆栈内容的变化。
记录:压入EAX前 ESP= 003AF8E8 ,(ESP)= 750A339A压入EAX后 ESP= 003AF8E4 ,(ESP)= 750A3388压入EBX前 ESP= 003AF8E4 ,(ESP)= 750A3388压入EBX后 ESP= 003AF8E0 ,(ESP)= 7EFDE000压入ECX前 ESP= 003AF8E0 ,(ESP)= 7EFDE000压入ECX后 ESP= 003AF8DC ,(ESP)= 00000000压入EDX前 ESP= 003AF8DC ,(ESP)= 00000000压入EDX后 ESP= 003AF8D8 ,(ESP)= 00241005操作过程中所用到的指令:INCLUDE Irvine32.inc.codemain PROCcall DumpRegsmov eax,[esp]call DumpRegspush eaxcall DumpRegspush ebxcall DumpRegspush ecxcall DumpRegspush edxcall DumpRegsexitmain ENDPEND main(Ⅱ)将堆栈中的内容依次弹出到EAX、EBX、ECX、EDX四个寄存器,注意观察栈指针寄存器和堆栈内容的变化。
记录:弹出到EAX前 ESP= 003AF8D8 ,(ESP)= 00241005弹出到EAX后 ESP= 003AF8DC ,(ESP)= 00000000弹出到EBX前 ESP= 003AF8DC ,(ESP)= 00000000弹出到EBX后 ESP= 003AF8E0 ,(ESP)= 7EFDE000弹出到ECX前 ESP= 003AF8E0 ,(ESP)= 7EFDE000弹出到ECX后 ESP= 003AF8E4 ,(ESP)= 750A3388弹出到EDX前 ESP= 003AF8E4 ,(ESP)= 750A3388弹出到EDX后 ESP= 003AF8E8 ,(ESP)= 750A339A操作过程中所用到的指令:pop eaxcall DumpRegspop ebxcall DumpRegspop ecxcall DumpRegspop edxcall DumpRegsexitmain ENDPEND main(3)已知EAX=3F56H,分别利用存储器直接寻址方式和存储器间接寻址方式,将EAX寄存器的内容送到内存单元中。
(Ⅰ)存储器直接寻址方式记录:送出到EAX前 EAX= 00003F56,[var]=00000000送出到EAX后 EAX= 00003F56 ,[var]=00003F56操作过程中所用到的指令:include Irvine32.inc.datavar dword ?.codemain procmov eax,varcall dumpregsmov eax,3f56hcall dumpregsmov var,eaxcall dumpregscall writehexexitmain endpend main(Ⅱ)存储器间接寻址方式记录:送出到EAX前 EAX= 00003F56 ,[var]=00000000用于存放地址码的寄存器( esi )= 00000000送出到EAX后 EAX=00003F56,[var]=00003F56操作过程中所用到的指令:include Irvine32.inc.datavar dword ?.codemain procmov eax,3F56Hcall dumpregsmov esi,offset varmov [esi],eaxcall dumpregsmov edx,varexitmain endpend main(4)已知EAX =3F56H,ECX =4690H,利用交换指令交换这两个寄存器的内容。
记录:交换前EAX= 00003F56H,ECX= 00004690H交换后 EAX= 00004690H, ECX=00003F56H操作过程中所用到的指令:Include Irvine32.inc.codemain PROCmov eax,3F56Hmov ecx,4690Hcall DumpRegsxchg eax,ecxcall DumpRegsexitmain ENDPEND main实验二逻辑指令、跳转指令与分支程序设计1、实验目的:了解和掌握逻辑指令、比较指令、无条件/有条件转移类指令的功能和作用,以及此类指令的使用方法。
2、实验要求:具体了解和掌握逻辑指令、比较指令、无条件/有条件转移类指令的使用和在使用时应注意的问题,学习分支型程序设计的一般方法。
(1)在DEBUG系统状态下,分别编制、调试并记录以下逻辑指令程序段的每一条指令的运行情况:(Ⅰ)mov al,41 ┃EAX = 750A3329H AL=29H or al,20 ┃EAX = 750A333DH AL=3DH (Ⅱ)mov al,66 ┃EAX = 750A3342H AL=42H and al,0df ┃EAX = 750A3342H AL=42H (Ⅲ)mov EAX,5678 ┃EAX = 0000162EHxor EAX,EAX ┃EAX = 00000000H(Ⅳ)mov EAX,0ff00 ┃EAX=0000FF00Hnot EAX ┃FFFF00FFH(Ⅴ)mov EAX,1234 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,1 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,2 ┃EAX = 000004D2H SF=0 ZF=0 OF=0test EAX,4 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,8 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,10 ┃EAX = 000004D2H SF=0 ZF=0 OF=0test EAX,20 ┃EAX = 000004D2H SF=0 ZF=0 OF=0test EAX,40 ┃EAX = 000004D2H SF=0 ZF=1 OF=0test EAX,80 ┃EAX = 000004D2H SF=0 ZF=0 OF=0test指令的作用是在源操作数和目的操作数之间进行布尔“与”运算,但不改变目的操作数,只是设置相应的CPU标志。
(2) 已知DATA单元开始存放三个带符号数,编制程序,检查三个数据是否同号,若同时为正,则在显示器上显示“+”;同时为负,则显示“-”;否则显示空格“”。
要求:分别用三组数据(同时为正,同时为负,异号)调试程序,验证程序的正确性。
INCLUDE Irvine32.inc.datavar1 sword 2var2 sword -1var3 sword 3.codemain PROC;三个数全部为正RCL var1,1 ;把最高位送到进位位jc A ;进位位为1,即CF为1,符号位为1负数,跳转RCL var2,1jc BRCL var3,1jc Bmov al,'+'call writecharjnc D ;全部为正,跳到结束A: ;三个数全部为负 ,此时已有var1为负RCL var2,1jnc B ;无进位位,符号为正,跳转RCL var3,1jnc B ;如果为正则跳转mov al,'-'call writecharjc D ;全部为负,跳到结束B: ;另外一种情况mov al,' 'call writecharD:exitmain ENDPEND main实验三算术运算类指令、移位指令及循环程序设计1、实验目的:了解和掌握加、减、乘、除指令的在程序设计中的用法和应注意的问题,了解和掌握移位指令的功能、作用和方法。
了解和掌握循环控制类指令的功能、作用和方法。
学会循环程序设计的方法。
学习汇编语言输出输入语句的设计。
2、实验要求:具体了解和掌握算术类指令、移位指令和循环控制类指令的使用,以及在使用时应注意的问题,学习循环程序设计的一般方法。
(1)在DEBUG系统状态下,分别编制、调试并记录以下加、减程序段的每一条指令的运行情况,查看寄存器的结果:(Ⅰ)MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000HMOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFHADD EAX,EBX ┃EAX = 0000D834H EBX = 0000CEDFH(Ⅱ)MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000HMOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFHSUB EAX,EBX ┃EAX = FFFF3A76H EBX = 0000CEDFH(Ⅲ)MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000HMOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFHADD AH,BH ┃EAX = 0000D755H EBX = 0000CEDFH AH=D7H BH=CEHADD AL,BL ┃EAX = 0000D734H EBX = 0000CEDFH AL=34H BL=DFH(Ⅳ)MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000HMOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFHADD AH,BH ┃EAX = 0000D755H EBX = 0000CEDFH AH=D7H BH=CEHADC AL,BL ┃EAX = 0000D734H EBX = 0000CEDFH AL=34H BL=DFH(2)在DEBUG系统状态下,分别编制、调试并记录以下乘、除程序段的每一条指令的运行情况:(Ⅰ)MOV AL,23 ┃EAX = 750A3317H EBX =7EFDE000H AL=17HMOV BL,0CEH ┃EAX = 750A3317H EBX =7EFDE0CEH BL=CEHMUL BL ┃EAX = 750A1282H EBX =7EFDE0CEH(Ⅱ)MOV AX,2389 ┃EAX = 750A0955H EBX =7EFDE000HMOV BX,0CEDFH ┃EAX = 750A0955H EBX =7EFDCEDFHMUL BX ┃EAX = 750A870BH EBX =7EFDCEDFH(Ⅲ)MOV AX,2389 ┃EAX = 750A0955H EBX =7EFDE000HMOV BL,0CEH ┃EAX = 750A0955H EBX =7EFDE0CEHDIV BL ┃EAX = 750A7B0BH EBX =7EFDE0CEH(Ⅳ)MOV AX,2389 ┃EAX = 750A0955H EBX = 7EFDE000H EDX = 00C41005HMOV DX,0856 ┃EAX = 750A0955H EBX = 7EFDE000H EDX = 00C40358HMOV BX,0CEDFH ┃EAX = 750A0955H EBX = 7EFDCEDFH EDX = 00C40358HDIV BX ┃EAX = 750A0423H EBX = 7EFDCEDFH EDX = 00C544D8H(3)在DEBUG系统状态下,分别编制、调试并记录以下移位指令程序段的每一条指令的运行情况:(Ⅰ)mov EAX,420 ┃EAX = 000001A4Hshl EAX,1 ┃EAX = 00000348H(Ⅱ)mov EAX,240 ┃EAX = 000000F0H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 000000F0H EBX = 7EFDE000H ECX = 00000004Hshl EAX,cl ┃EAX = 00000F00H EBX = 7EFDE000H ECX = 00000004H(Ⅲ)mov EAX,8000 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000004Hshr EAX,cl ┃EAX = 000001F4H EBX = 7EFDE000H ECX = 00000004H(Ⅳ)mov EAX,8000 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000004Hsar EAX,cl ┃EAX = 000001F4H EBX = 7EFDE000H ECX = 00000004H(Ⅴ)mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004Hrol EAX,cl ┃EAX = 0001F960H EBX =7EFDE000H ECX = 00000004H(Ⅵ)mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004Hror EAX,cl ┃EAX = 600001F9H EBX = 7EFDE000H ECX = 00000004H(Ⅶ)mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F96H EBX =7EFDE000H ECX = 00000004Hrcl EAX,cl ┃EAX = 0001F960H EBX = 7EFDE000H ECX = 00000004H(Ⅷ)mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000Hmov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004Hrcr EAX,cl ┃EAX = C00001F9H EBX =7EFDE000H ECX = 00000004Hrol与rcl、ror与rcr的区别在于rol和ror是将寄存器中的内容直接进行移位,而rcl和rcr是将寄存器中的内容与进位标志中的内容一起进行移位,因此参加移位的数据比原来的数据位数多一位。