汇编实验报告 本文关键词:汇编,实验,报告
汇编实验报告 本文简介:《汇编语言程序设计》第二次上机2-1实验报告院系:计算机科学与技术专业:信息安全班级:0903班姓名:学号:时间:2011-6-6地点:南一楼808一、实验目的3二、题目与实验要求3三、寄存器分配和变量定义说明:3四、流程图5五、源程序及注释7六、实验步骤13七、实验记录13八、体会16一、实验目的
汇编实验报告 本文内容:
《汇编语言程序设计》
第二次上机2-1实验报告
院系:计算机科学与技术
专业:信息安全
班级:0903班
姓名:
学号:
时间:2011-6-6
地点:南一楼808
一、实验目的3
二、题目与实验要求3
三、寄存器分配和变量定义说明:3
四、流程图5
五、源程序及注释7
六、实验步骤13
七、实验记录13
八、体会16
一、实验目的
1、加深对一些常用的汇编指令的理解;
2、加深对常用DOS功能调用指令的理解;
3、进一步熟悉TD的使用。
二、题目与实验要求
1、《80X86汇编语言程序设计》教材中
P95的
3.7
题。
要求:(1)将该题改成一完整的程序(可以省略实验报告中的程序框图)。
(2)请事先指出依次执行每条程序指令后(AX)的内容。
(3)请事先指出执行ADD、SUB、SAL、RCL指令后,CF、ZF的值。
(4)记录上机执行后与(2)、(3)
中对应的内容。
2、《80X86汇编语言程序设计》教材中
P94的
3.3
题。
要求:(1)将该题改成一完整的程序,其中数据段的定义为习题3.1中的数据段(可以省略实验报告中的程序框图)。
(2)请事先画出数据段中数据的存储形式。
(3)请事先指出依次执行每条程序指令后相应寄存器中的内容。
(4)请事先给出各调指令在汇编后的形式。
(5)比较上机执行后,看到的各项内容是否与(2)、(3),(4)内容一致。不一致的应分析错误原因。
3、《80X86汇编语言程序设计》教材中
P96的
3.11
题。
要求:(1)请事先指出程序运行结束后,显示器显示的内容。
(2)若将NUM的定义改成如下形式:
NUM
DB
35
显示的结果是什么?
(3)若将NUM的定义改成如下形式:
NUM
DB
59
显示的结果是什么?
(4)指出程序运行后看到的结果,若不一致,分析产生错误的原因。
4.
从键盘输入两串字符分别存入BUF1和BUF2区,比较两串内容是否相等,
相等显示“MATCH
!”,不相等显示“NO
MATCH
!”。
要求:(1)
使用10号功能调用输入字符串;
(2)
使用
9号功能调用输出提示信息;
提示:先比较长度是否相等。
5
选做题
输入一个无符号的数字串,然后以16进制形式显示出串的值。
例如:
INPUT
A
NUMBER
:
59?
RESULT
:
3BH
其中下划线上的内容(59)为程序运行时输入的串。
三、寄存器分配和变量定义说明:
题目3
1.
存储单元分配:
NUM为一个定义在数据段中的字节变量,存储一个二进制数
BUF为一个定义在数据段中的字节变量,存储回车换行与提示信息
BUF0为一个定义在数据段中的字节变量,存储一个十六进制数
2.
寄存器分配:
DI存储BUF0中某个字节的地址,用于寄存器间接寻址
AL存储NUM中二进制数高四位与低四位对应的数字的ASCII码
题目4
1.
存储单元分配:
BUF1、BUF2为两个定义在数据段中的字节变量,存储输入的字符串信息
BUF3为一个定义在数据段中的字节变量,回车换行
BUF4、BUF5为两个定义在数据段中的字节变量,存储提示信息
2.
寄存器分配:
BX作为变址寻址寄存器使用
题目5(选做题)
1.
存储单元分配:
STR1、STR2为两个定义在数据段中的字节变量,存储提示信息
BUF1为一个定义在数据段中的字节变量,存储输入的字符串信息
BUF2为一个定义在数据段中的字节变量,回车换行
2.
寄存器分配:
AX存储输入的字符串对应的数字
CX用作计数器,控制循环次数
DI用作变址寻址的变址寄存器
四、流程图
题目4
开始
比较两字符串长度是否相等
相等
不想等
结束
输入两个字符串
N
N
Y
Y
比较两字符串是否相等
题目5(选做题)
开始
字符串转化为对应的整数
整数转化为对应的十六进制数的字符
结束
输入数字字符串
输出转化后的十六进制数的字符
五、源程序及注释
题目1
.386
DATASEGMENTUSE16
BUFDB?
DATAENDS
STACKSEGMENTUSE16STACK
DB200
DUP(0)
STACK
ENDS
CODESEGMENTUSE16
ASSUMEDS:DATA,SS:STACK,CS:CODE
START:
MOVAX,DATA
MOVDS,AX
MOVAX,0
DECAX
ADDAX,07FFFH
ADDAX,2
NOTAX
SUBAX,0FFFFH
ADDAX,8000H
ORAX,0BFDFH
ANDAX,0EBEDH
XCHGAH,AL
SALAX,1
RCLAX,1
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
题目2
.386
DATASEGMENTUSE16
STR1DB0,1,2,3,4,5
STR2DB
012345
COUNTEQU30
NUMBDB3
DUP(2)
NUMWDW10H,-60H
POINDW0
DATAENDS
STACKSEGMENTUSE16STACK
DB200
DUP(0)
STACK
ENDS
CODESEGMENTUSE16
ASSUMEDS:DATA,SS:STACK,CS:CODE
START:
MOVAX,DATA
MOVDS,AX
MOVBX,OFFSET
STR1+3
MOVSI,OFFSET
STR2
MOVCL,COUNT
MOVDX,WORD
PTR
NUMB
MOVBP,NUMW+2
MOVAL,3[SI]
MOVAH,[SI+BX+1]
MOVCH,BYTE
PTR
NUMW+3
MOVSXEAX,AX
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
题目3
.386
A1SEGMENTUSE16
NUMDB00111001B
BUFDB0AH,0DH,(NUM)=
BUF0DB4
DUP(?)
A1
ENDS
B1SEGMENTUSE16STACK
DB200
DUP(0)
B1ENDS
C1SEGMENTUSE16
ASSUMEDS:A1,SS:B1,CS:C1
BEGIN:
MOVAX,A1
MOVDS,AX
LEADI,BUF0
MOVAL,NUM
SHRAL,4
ORAL,30H
MOV[DI],AL
INCDI
MOVAL,NUM
ANDAL,0FH
ORAL,30H
MOV[DI],AL
INCDI
MOVBYTE
PTR
[DI],H
INCDI
MOVBYTE
PTR
[DI],$
LEADX,BUF
MOVAH,9
INT21H
MOVAH,4CH
INT21H
C1ENDS
ENDBEGIN
题目4
.386
DATA
SEGMENT
USE16
BUF1
DB
60
DB
?
DB
60
DUP(?)
BUF2
DB
60
DB
?
DB
60
DUP(?)
BUF3
DB
0DH,0AH,$
BUF4DB
MATCH
!$
BUF5DB
NO
MATCH
!$
DATA
ENDS
STACK
SEGMENTUSE16
STACK
DB
200
DUP(0)
STACKENDS
CODESEGMENTUSE16
ASSUMEDS:DATA,CS:CODE,SS:STACK
START:
MOVAX,DATA
MOV
DS,AX
LEA
DX,BUF1
MOV
AH,10
INT
21H
LEADX,BUF3
MOVAH,9
INT21H
LEA
DX,BUF2
MOV
AH,10
INT
21H
LEADX,BUF3
MOVAH,9
INT21H
XORBH,BH
MOVBL,BUF1[1]
;BUF1中的字符串长度存入BL
MOVCL,BUF2[1]
;BUF2中的字符串长度存入CL
CMPBL,CL
;比较两字符串长度
JNENO
INCBL
LOOP1:MOVCL,BUF1[BX]
CMPCL,BUF2[BX]
;比较相同位置的字符是否相同
JNENO
DECBL
CMPBL,1
;判断字符串是否比较完毕
JNELOOP1
LEA
DX,BUF4
MOVAH,9
INT21H
JMPEXIT
NO:LEA
DX,BUF5
MOVAH,9
INT21H
EXIT:MOVAH,4CH
INT21H
CODEENDS
ENDSTART
题目5(选做题)
.386
DATASEGMENTUSE16
STR1DB
INPUT
A
NUMBER:
$
STR2DB
RESULT:
$
BUF1DB
60
DB?
DB60
DUP(0)
BUF2DB0DH,0AH,$
DATAENDS
STACKSEGMENTUSE16STACK
DB200
DUP(0)
STACKENDS
CODESEGMENTUSE16
ASSUMECS:CODE,SS:STACK,DS:DATA
START:
MOVAX,DATA
MOVDS,AX
LEADX,STR1
MOVAH,9
INT21H
LEADX,BUF1
MOVAH,10
INT21H
LEADX,BUF2
MOVAH,9
INT21H
LEADX,STR2
MOVAH,9
INT21H
XORAX,AX
XORCH,CH
XORDX,DX
MOVCL,BUF1[1]
;数字字符串长度存入CL
MOVBX,10
MOVDI,2
LOOP1:MULBX
;开始将字符串转化为十进制数存入AX
MOVDL,BUF1[DI]
SUBDX,30H
ADDAX,DX
XORDX,DX
INCDI
LOOPLOOP1
MOVBX,16
LOOP2:INCCX
DIVBX
CMPDX,10
;判断是否小于10
JLJMP1
ADDDX,7
JMP1:ADDDX,30H
;转化为对应的十六进制数
PUSHDX
XORDX,DX
CMPAX,0
JNELOOP2
LOOP3:POPDX
MOVAH,2
INT21H
;从高位至低位依次输出十六进制数
LOOPLOOP3
MOVDL,H
MOVAH,2
;输出字母H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
六、实验步骤
1.
存盘文件名依次为1-1.ASM、1-2.ASM、1-3.ASM、1-4.ASM、1-5.ASM。
2.
使用MASM5.0汇编源文件。
3.
观察提示信息,若出错,则用编辑程序修改错误,存盘后重新汇编,直至不再报错为止。
4.
使用连接程序LINK.EXE将汇编生成的OBJ文件连接成执行文件。
5.
若连接时报错,则依照错误信息修改源程序。之后重新汇编和连接,直至不再报错并生成EXE文件。
6.
执行该程序,观察执行现象。
七、实验记录
题目1
事先指出依次执行每条程序指令后(AX)的内容:
0000H,0FFFFH,7FFEH,8000H,7FFFH,8000H,0000H,0BFDFH,
0ABCDH,0CDABH,9B56H,36ADH
事先指出执行ADD、SUB、SAL、RCL指令后,CF、ZF的值:
CF:1,0,1,1
ZF:0,0,0,1
测试结果:
依次执行每条程序指令后(AX)的内容:
0000H,0FFFFH,7FFEH,8000H,7FFFH,8000H,0000H,0BFDFH,
0ABCDH,0CDABH,9B56H,36ADH
执行ADD、SUB、SAL、RCL指令后,CF、ZF的值依次为:
CF:1,0,1,1
ZF:0,0,0,1
题目2
数据段中数据的存储形式:
01H
02H
03H
04H
05H
31H
32H
33H
34H
35H
02H
02H
02H
00H
30H
10H
00H
A0H
FFH
00H
00H
STR1
STR2
NUMB
NUMW
POIN
依次执行每条程序指令后相应寄存器中的内容:
AX:3433,BX:0003,CX:FF1E,DX:0202,
SI:0006,DI:0000,BP:FFA0,SP:00C8,EAX:00003433
给出各调指令在汇编后的形式:
MOVBX,0003
MOVSI,0006
MOVCL,1E
MOVDX,[000C]
MOVBP,[0011]
MOVAL,[SI+3]
MOVAH,[SI+BX+1]
MOVCH,[0012]
MOVSXEAX,AX
测试结果:
数据段中数据的存储:
依次执行每条程序指令后相应寄存器中的内容:
各调指令在汇编后的形式:
题目3
事先指出程序运行结束后,显示器显示的内容:
(NUM)=39H
若将NUM的定义改成如下形式:
NUM
DB
35
显示的结果是:
(NUM)=23H
若将NUM的定义改成如下形式:
NUM
DB
59
显示的结果是:
(NUM)=3BH
测试结果:
NUM
DB
00111001B
NUM
DB
35
NUM
DB
59
错误原因:
转化为十六进制数时,当需要转化的数小于10时,只需加上30H即可转化为该数字对应的ASCII码,当需要转化的数1大于9且小于16时,需要加上37H才能转化为对应的十六进制数,而源程序只考虑了小于10的情况
题目4
测试结果:
题目5(选做题)
测试结果:
八、体会
通过这次上机实验,提高了我对汇编程序源代码的阅读能力,也使我对与各种寻址方法用了更深的了解
17