课程编号:B080103020
《汇编语言程序设计》
实验报告
东北大学软件学院
实验1 数据传送指令
1、 实验目的:
了解和掌握 MOV、PUSH、POP、XCHG四条指令的作用和在编程中的用法。
2、实验要求:
(Ⅰ)采用立即数寻址方式将19E0H,3F56H,0AF37H,9A81H分别送给EAX、EBX、ECX、EDX四个寄存器。
记录:操作前 EAX=75C59191、 EBX=7FFDE000 、 ECX=00000000、 EDX=00401000
操作后 EAX=000019E0、 EBX=00003F56、 ECX=0000AF37、 EDX=00009A81
操作过程中所用到的指令:
INCLUDE Irvine32.inc
.code
main PROC
call DumpRegs
mov eax,19E0H
mov ebx,3F56H
mov ecx,0AF37H
mov edx,9A81H
call DumpRegs
exit
main endp
END main
(Ⅱ)采用采用寄存器寻址方式将19E0H送给EBX、ECX、EDX三个寄存器。
记录:操作前 EAX=75C59191、 EBX=7FFDE000 、 ECX=00000000、 EDX=00401000
操作后 EAX=000019E0、 EBX=000019E0、 ECX=000019E0、 EDX=000019E0 操作过程中所用到的指令:
INCLUDE Irvine32.inc
.code
main PROC
call DumpRegs
mov eax,19E0H
mov ebx,eax
mov ecx,ebx
mov edx,ecx
call DumpRegs
exit
main endp
END main
(2)对EAX、EBX、ECX、EDX四个寄存器进行出入堆栈的操作。
(Ⅰ)将EAX、EBX、ECX、EDX四个寄存器的内容依次压入堆栈中,注意观察栈指针寄存器和堆栈内容的变化。
记录:压入EAX前 ESP=0018FF90, (ESP)=75C5919F
压入EAX后 ESP=0018FF8C, (ESP)=00000000
压入EBX前 ESP=0018FF8C, (ESP)=00000000
压入EBX后 ESP=0018FF88, (ESP)=00000000
压入ECX前 ESP=0018FF88, (ESP)=00000000
压入ECX后 ESP=0018FF84, (ESP)=00000000
压入EDX前 ESP=0018FF84, (ESP)=00000000
压入EDX后 ESP=0018FF80, (ESP)=FFFFC000
操作过程中所用到的指令:
INCLUDE Irvine32.inc
.code
main PROC
call DumpRegs
mov eax,[esp]
call DumpRegs
push eax
call DumpRegs
push ebx
call DumpRegs
push ecx
call DumpRegs
push edx
call DumpRegs
exit
main endp
END main
(Ⅱ)将堆栈中的内容依次弹出到EAX、EBX、ECX、EDX四个寄存器, 注意观察栈指针寄存器和堆栈内容的变化。
记录:弹出到EAX前 ESP=0018FF90, (ESP)=00000000
弹出到EAX后 ESP=0018FF94, (ESP)=00000000
弹出到EBX前 ESP=0018FF94, (ESP)=00000000
弹出到EBX后 ESP=0018FF98, (ESP)=00000000
弹出到ECX前 ESP=0018FF98, (ESP)=00000000
弹出到ECX后 ESP=0018FF9C, (ESP)= E18A40B7
弹出到EDX前 ESP=0018FF9C, (ESP)= E18A40B7
弹出到EDX后 ESP=0018FFA0, (ESP)= FFFFF801
操作过程中所用到的指令:
include Irvine32.inc
.code
main proc
mov esi,[esp]
call DumpRegs
push eax
mov esi,[esp]
call DumpRegs
push ebx
mov esi,[esp]
call DumpRegs
push ecx
mov esi,[esp]
call DumpRegs
push edx
pop edx
mov esi,[esp]
call DumpRegs
pop ecx
mov esi,[esp]
call DumpRegs
pop ebx
mov esi,[esp]
call DumpRegs
pop eax
mov esi,[esp]
call DumpRegs
exit
main endp
end main
(3)已知EAX =3F56H,ECX =4690H,利用交换指令交换这两个寄存器的内容。
记录:交换前 EAX= 00003F56 , ECX=00004690
交换后 EAX= 00004690 , ECX=00003F56
操作过程中所用到的指令:
Include Irvine32.inc
.code
main PROC
mov eax,3F56H
mov ecx,4690H
call DumpRegs
xchg eax,ecx
call DumpRegs
exit
main ENDP
END main
实验二 逻辑指令、跳转指令与分支程序设计
1、 实验目的:
了解和掌握逻辑指令、比较指令、无条件/有条件转移类指令的功能和作用,以及此类指令的使用方法。
2、 实验要求:
具体了解和掌握逻辑指令、比较指令、无条件/有条件转移类指令的使用和在使用时应注意的问题,学习分支型程序设计的一般方法。
(1)在DEBUG系统状态下,分别编制、调试并记录以下逻辑指令程序段的每一条指令的运行情况:
(Ⅰ)
mov al,41 ┃al=29H
or al,20 ┃al=3DH
(Ⅱ)
mov al,66 ┃al=42H
and al,0df ┃al=00H
(Ⅲ)
mov EAX,5678 ┃EAX=0000162EH
xor EAX,EAX ┃EAX=00000000H
(Ⅳ)
mov EAX,0ff00 ┃EAX=0000FF00H
not EAX ┃EAX=FFFF00FFH
(Ⅴ)
mov EAX,1234 ┃EAX=000004D2H
test EAX,1 ┃EAX=000004D2H SF=0 ZF=1 OF=0
test EAX,2 ┃EAX=000004D2H SF=0 ZF=0 OF=0
test EAX,4 ┃EAX=000004D2H SF=0 ZF=1 OF=0
test EAX,8 ┃EAX=000004D2H SF=0 ZF=1 OF=0
test EAX,10 ┃EAX=000004D2H SF=0 ZF=0 OF=0
test EAX,20 ┃EAX=000004D2H SF=0 ZF=0 OF=0
test EAX,40 ┃EAX=000004D2H SF=0 ZF=1 OF=0
test EAX,80 ┃EAX=000004D2H SF=0 ZF=0 OF=0
test指令的作用是____将原操作数与目的操作数相与,但结果不送会目的操作数,只改变标志位,并不修改操作数____________。
(2) 已知DATA单元开始存放三个带符号数,编制程序,检查三个数据是否同号,若同时为正,则在显示器上显示“+”;同时为负,则显示“-”;否则显示空格“ ”。
要求:分别用三组数据(同时为正,同时为负,异号)调试程序,验证程序的正确性。
include Irvine32.inc
.data
interray sdword 23h,23h,-23h
.code
main proc
mov edi,OFFSET interray
mov eax,[edi]
and eax,80000000h
push eax
mov eax,[edi+4]
and eax,80000000h
push eax
mov eax,[edi+8]
and eax,80000000h
push eax
pop eax
pop ebx
pop ecx
jnz L1
cmp eax,ebx
jne L2
cmp eax,ecx
jne L2
mov al,'+'
call WriteChar
exit
L1:
cmp eax,ebx
jne L2
cmp eax,ecx
jne L2
mov al,'-'
call WriteChar
exit
L2:
mov al,' '
call WriteChar
exit
main endp
end main
实验三 算术运算类指令、移位指令及循环程序设计
1、 实验目的:
了解和掌握加、减、乘、除指令的在程序设计中的用法和应注意的问题,了解和掌握移位指令的功能、作用和方法。了解和掌握循环控制类指令的功能、作用和方法。学会循环程序设计的方法。学习汇编语言输出输入语句的设计。
2、 实验要求:
具体了解和掌握算术类指令、移位指令和循环控制类指令的使用,以及在使用时应注意的问题,学习循环程序设计的一般方法。
(1)在DEBUG系统状态下,分别编制、调试并记录以下加、减程序段的每一条指令的运行情况,查看寄存器的结果:
(Ⅰ)
MOV EAX,2389 ┃ EAX=00000955H
MOV EBX,0CEDFH ┃EBX=0000CEDFH
ADD EAX,EBX ┃EAX= 0000D834H EBX=0000CEDFH
(Ⅱ)
MOV EAX,2389 ┃EAX=00000955H
MOV EBX,0CEDFH ┃EBX=0000CEDFH
SUB EAX,EBX ┃EAX=FFFF3A76H EBX=0000CEDFH
(Ⅲ)
MOV EAX,2389 ┃EAX=00000955H
MOV EBX,0CEDFH ┃EBX=0000CEDFH
ADD AH,BH ┃AH=D7 BH=CE
ADD AL,BL ┃AL=34 BL=DF
(Ⅳ)
MOV EAX,2389 ┃EAX=00000955H
MOV EBX,0CEDFH ┃EBX=0000CEDFH
ADD AH,BH ┃AH=D7 BH=CE
ADC AL,BL ┃AL=34 BL=DF EFL = 00000213
(2)在DEBUG系统状态下,分别编制、调试并记录以下乘、除程序段的每一条指令的运行情况:
(Ⅰ)
MOV AL,23 ┃AL=17H
MOV BL,0CEH ┃BL=CEH
MUL BL ┃AX=1282H OV=1
(Ⅱ)
MOV AX,2389 ┃AX=0955H
MOV BX,0CEDFH ┃BX=CEDFH
MUL BX ┃DX= 078AH AX=870BH CF=1
(Ⅲ)
MOV AX,2389 ┃AX=0955H
MOV BL,0CEH ┃BL=0CEH
DIV BL ┃AH=7BH AL=0BH
(Ⅳ)
MOV AX,2389 ┃AX=0955H
MOV DX,0856 ┃DX=0358H
MOV BX,0CEDFH ┃BX=CEDFH
DIV BX ┃AX=0423H DX=44D8H
(3)在DEBUG系统状态下,分别编制、调试并记录以下移位指令程序段的每一条指令的运行情况:
(Ⅰ)
mov EAX,420 ┃EAX=000001A4H
shl EAX,1 ┃CF=0 EAX=00000348H
(Ⅱ)
mov EAX,240 ┃EAX=000000F0H
mov cl,4 ┃CL=04H
shl EAX,cl ┃CF=0 EAX=00000F00H
(Ⅲ)
mov EAX,8000 ┃EAX=00001F04H
mov cl,4 ┃CL=04H
shr EAX,cl ┃CF=0 EAX=000001F4H
(Ⅳ)
mov EAX,8000 ┃EAX=00001F04H
mov cl,4 ┃CL=04H
sar EAX,cl ┃CF= 0 EAX=000001F4H
(Ⅴ)
mov EAX,8086 ┃EAX=00001F96H
mov cl,4 ┃CL=04H
rol EAX,cl ┃CF=0 EAX=00001F96H
(Ⅵ)
mov EAX,8086 ┃EAX=00001F96H
mov cl,4 ┃CL=04H
ror EAX,cl ┃CF=0 EAX=60001F9H
(Ⅶ)
mov EAX,8086 ┃EAX=00001F96H
mov cl,4 ┃CL=04H
rcl EAX,cl ┃CF=0 EAX=0001F960H
(Ⅷ)
mov EAX,8086 ┃EAX=00001F96H
mov cl,4 ┃CL=04H
rcr EAX,cl ┃CF=0 EAX=C00001F9H
rol与rcl、ror与rcr的区别在于rol和ror是将寄存器中的内容直接进行移位,而rcl和rcr是将寄存器中的内容与____CF____中的内容一起进行移位,因此参加移位的数据比原来的数据位数______多一______。
(5) 已知DATA单元开始存放一组无符号的字节数据,数据长度在CNT单元存放。编制程序,检查该组数据中是否存在数据100,若存在,则在显示器上显示“Y”,否则显示“N”。
include Irvine32.inc
.data
ay word 1,4,8,100
cnt word 4
.code
main proc
mov cx,cnt
L1:
mov ax,0
push ax
mov bx,[ay+ax]
cmp bx,0064h
je L2
mov al,'N'
call WriteChar
jmp quit
L2:
mov al,'Y'
call WriteChar
jmp quit
quit:
pop ax
add ax,4
LOOP L1
exit
main endp
end main
(6) 编制在屏幕上显示九九表的程序。
include Irvine32.inc
.code
main proc
mov edx,0
L1:
call Crlf
mov ebx,1
inc edx
L3:
push edx
mov eax,edx
mul ebx
mov esi,eax
pop edx
mov eax,ebx
call WriteDec
push edx
mov al,'*'
call WriteChar
pop edx
mov eax,edx
call WriteDec
push edx
mov al,'='
call WriteChar
pop edx
mov eax,esi
call WriteDec
push edx
mov al,' '
call WriteChar
pop edx
cmp ebx,9
jz L2
cmp ebx,edx
jz L1
inc ebx
jmp L3
L2:
call Crlf
exit
main endp
end main