(附录二)
汇编语言程序设计
实验报告
实验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
.code
main PROC
call DumpRegs
mov eax,19E0H
mov ebx,eax
mov ecx,ebx
mov edx,ecx
call DumpRegs
exit
main ENDP
END main
(Ⅱ)采用采用寄存器寻址方式将19E0H送给EBX、ECX、EDX三个寄存器。
记录:操作前 EAX= 750A3388 、 EBX= 7EFDE000 、 ECX= 000000000 、 EDX= 013C1005
操作后 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= 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
.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= 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 eax
call DumpRegs
pop ebx
call DumpRegs
pop ecx
call DumpRegs
pop edx
call DumpRegs
exit
main ENDP
END main
(3)已知EAX=3F56H,分别利用存储器直接寻址方式和存储器间接寻址方式,将EAX寄存器的内容送到内存单元中。
(Ⅰ)存储器直接寻址方式
记录:送出到EAX前 EAX= 00003F56 , [var]=00000000
送出到EAX后 EAX= 00003F56 , [var]=00003F56
操作过程中所用到的指令:
include Irvine32.inc
.data
var dword ?
.code
main proc
mov eax,var
call dumpregs
mov eax,3f56h
call dumpregs
mov var,eax
call dumpregs
mov var,eax
call writehex
exit
main endp
end main
(Ⅱ)存储器间接寻址方式
记录:送出到EAX前 EAX= 00003F56 , [var]=00000000
用于存放地址码的寄存器( esi )=00000000
送出到EAX后 EAX=00003F56 , [var]=00003F56
操作过程中所用到的指令:
include Irvine32.inc
.data
var dword ?
.code
main proc
mov eax,3F56H
mov ebx,var
call dumpregs
mov esi,offset var
mov [esi],eax
call dumpregs
mov edx,var
exit
main endp
end main
(4)已知EAX =3F56H,ECX =4690H,利用交换指令交换这两个寄存器的内容。
记录:交换前 EAX= 00003F56H, ECX=00004690H
交换后 EAX= 00004690H, ECX=00003F56H
操作过程中所用到的指令:
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 ┃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 = 0000162EH
xor EAX,EAX ┃EAX = 00000000H
(Ⅳ)
mov EAX,0ff00 ┃EAX=0000FF00H
not EAX ┃FFFF00FFH
(Ⅴ)
mov EAX,1234 ┃EAX = 000004D2H SF=0 ZF=1 OF=0
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指令的作用是 在源操作数和目的操作数之间进行布尔“与”运算,但不改变目的操作数,只是设置相应的CPU标志 。
(2) 已知DATA单元开始存放三个带符号数,编制程序,检查三个数据是否同号,若同时为正,则在显示器上显示“+”;同时为负,则显示“-”;否则显示空格“ ”。
要求:分别用三组数据(同时为正,同时为负,异号)调试程序,验证程序的正确性。
INCLUDE Irvine32.inc
.data
var1 sword 2
var2 sword -1
var3 sword 3
.code
main PROC
;三个数全部为正
RCL var1,1 ;把最高位送到进位位
jc A ;进位位为1,即CF为1,符号位为1负数,跳转
RCL var2,1
jc B
RCL var3,1
jc B
mov al,'+'
call writechar
jnc D ;全部为正,跳到结束
A: ;三个数全部为负 ,此时已有var1为负
RCL var2,1
jnc B ;无进位位,符号为正,跳转
RCL var3,1
jnc B ;如果为正则跳转
mov al,'-'
call writechar
jc D ;全部为负,跳到结束
B: ;另外一种情况
mov al,' '
call writechar
D:
exit
main ENDP
END main
实验三 算术运算类指令、移位指令及循环程序设计
1、实验目的:了解和掌握加、减、乘、除指令的在程序设计中的用法和应注意的问题,了解和掌握移位指令的功能、作用和方法。了解和掌握循环控制类指令的功能、作用和方法。学会循环程序设计的方法。学习汇编语言输出输入语句的设计。
2、实验要求:具体了解和掌握算术类指令、移位指令和循环控制类指令的使用,以及在使用时应注意的问题,学习循环程序设计的一般方法。
(1)在DEBUG系统状态下,分别编制、调试并记录以下加、减程序段的每一条指令的运行情况,查看寄存器的结果:
(Ⅰ)
MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000H
MOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFH
ADD EAX,EBX ┃EAX = 0000D834H EBX = 0000CEDFH
(Ⅱ)
MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000H
MOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFH
SUB EAX,EBX ┃EAX = FFFF3A76H EBX = 0000CEDFH
(Ⅲ)
MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000H
MOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFH
ADD AH,BH ┃EAX = 0000D755H EBX = 0000CEDFH AH=D7H BH=CEH
ADD AL,BL ┃EAX = 0000D734H EBX = 0000CEDFH AL=34H BL=DFH
(Ⅳ)
MOV EAX,2389 ┃EAX = 00000955H EBX = 7EFDE000H
MOV EBX,0CEDFH ┃EAX = 00000955H EBX = 0000CEDFH
ADD AH,BH ┃EAX = 0000D755H EBX = 0000CEDFH AH=D7H BH=CEH
ADC AL,BL ┃EAX = 0000D734H EBX = 0000CEDFH AL=34H BL=DFH
(2)在DEBUG系统状态下,分别编制、调试并记录以下乘、除程序段的每一条指令的运行情况:
(Ⅰ)
MOV AL,23 ┃EAX = 750A3317H EBX = 7EFDE000H AL=17H
MOV BL,0CEH ┃EAX = 750A3317H EBX = 7EFDE0CEH BL=CEH
MUL BL ┃EAX = 750A1282H EBX = 7EFDE0CEH
(Ⅱ)
MOV AX,2389 ┃EAX = 750A0955H EBX = 7EFDE000H
MOV BX,0CEDFH ┃EAX = 750A0955H EBX = 7EFDCEDFH
MUL BX ┃EAX = 750A870BH EBX = 7EFDCEDFH
(Ⅲ)
MOV AX,2389 ┃EAX = 750A0955H EBX = 7EFDE000H
MOV BL,0CEH ┃EAX = 750A0955H EBX = 7EFDE0CEH
DIV BL ┃EAX = 750A7B0BH EBX = 7EFDE0CEH
(Ⅳ)
MOV AX,2389 ┃EAX = 750A0955H EBX = 7EFDE000H EDX = 00C41005H
MOV DX,0856 ┃EAX = 750A0955H EBX = 7EFDE000H EDX = 00C40358H
MOV BX,0CEDFH ┃EAX = 750A0955H EBX = 7EFDCEDFH EDX = 00C40358H
DIV BX ┃EAX = 750A0423H EBX = 7EFDCEDFH EDX = 00C544D8H
(3)在DEBUG系统状态下,分别编制、调试并记录以下移位指令程序段的每一条指令的运行情况:
(Ⅰ)
mov EAX,420 ┃EAX = 000001A4H
shl EAX,1 ┃EAX = 00000348H
(Ⅱ)
mov EAX,240 ┃EAX = 000000F0H EBX = 7EFDE000H ECX = 00000000H
mov cl,4 ┃EAX = 000000F0H EBX = 7EFDE000H ECX = 00000004H
shl EAX,cl ┃EAX = 00000F00H EBX = 7EFDE000H ECX = 00000004H
(Ⅲ)
mov EAX,8000 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000000H
mov cl,4 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000004H
shr EAX,cl ┃EAX = 000001F4H EBX = 7EFDE000H ECX = 00000004H
(Ⅳ)
mov EAX,8000 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000000H
mov cl,4 ┃EAX = 00001F40H EBX = 7EFDE000H ECX = 00000004H
sar EAX,cl ┃EAX = 000001F4H EBX = 7EFDE000H ECX = 00000004H
(Ⅴ)
mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000H
mov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004H
rol EAX,cl ┃EAX = 0001F960H EBX = 7EFDE000H ECX = 00000004H
(Ⅵ)
mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000H
mov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004H
ror EAX,cl ┃EAX = 600001F9H EBX = 7EFDE000H ECX = 00000004H
(Ⅶ)
mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000H
mov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004H
rcl EAX,cl ┃EAX = 0001F960H EBX = 7EFDE000H ECX = 00000004H
(Ⅷ)
mov EAX,8086 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000000H
mov cl,4 ┃EAX = 00001F96H EBX = 7EFDE000H ECX = 00000004H
rcr EAX,cl ┃EAX = C00001F9H EBX = 7EFDE000H ECX = 00000004H
rol与rcl、ror与rcr的区别在于rol和ror是将寄存器中的内容直接进行移位,而rcl和rcr是将寄存器中的内容与 进位标志 中的内容一起进行移位,因此参加移位的数据比原来的数据位数 多一位 。
(5) 已知DATA单元开始存放一组无符号的字节数据,数据长度在CNT单元存放。编制程序,检查该组数据中是否存在数据100,若存在,则在显示器上显示“Y”,否则显示“N”。
include Irvine32.inc
.data
ay dword 2,100,1
cnt word 3
.code
main proc
mov cx,cnt
mov edx,OFFSET ay
mov ebx,[edx]
mov esi,0
L1:
mov ax,0
push ax
cmp bx,100
je L2
mov al,'N'
call WriteChar
jmp Quit
L2:
mov al,'Y'
call WriteChar
jmp Quit
quit:
pop ax
add ax,4
add esi,4
mov ebx,[edx+esi]
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
L2:
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 L4
cmp ebx,edx
jz L1
jb L3
L3:
inc ebx
jmp L2
L4:
call crlf
exit
main endp
end main