汇编语言实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

汇编语⾔实验报告
福建农林⼤学⾦⼭学院
(程序设计类课程)
实验报告
课程名称:汇编语⾔
姓名:
系:
专业:
年级:
学号:
指导教师:
职称:
2010~2011学年第⼆学期
实验项⽬列表
福建农林⼤学⾦⼭学院实验报告
系:专业:年级:
姓名:学号:实验课程:汇编语⾔
实验室号:_ _1#605 实验设备号: I3 实验时间: 2011.4.25 指导教师签字:成绩:实验⼀汇编程序的汇编及运⾏
1.实验⽬的和要求
(1)熟悉汇编程序的汇编、连接、执⾏过程;
(2)⽣成LST⽂件,查看LST⽂件;
(3)⽣成OBJ⽂件,修改语法错误;
(4)⽣成EXE⽂件;
(5)执⾏程序。

2.实验环境
IBM—PC机及其兼容机;
实验的软件环境是:
操作系统:DOS 2.0以上;调试程序:/doc/aa5b4424a5e9856a56126062.html ;⽂本编程程序:EDIT.EXE、WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;
交叉引⽤程序:CREF.EXE(可有可⽆)。

3.实验内容及实验数据记录
(1)将数据段输⼊,取名1.txt,保存在MASM⽂件夹下。

⽣成LST⽂件,(不
必连接、运⾏)⽤EDIT查看1.LST⽂件。

试回答:DA1,DA2的偏移量分别是多少?COUNT的值为多少?
DATA SEGMENT
ORG 20H
NUM1=8
NUM2=NUM1+10H
DA1 DB ‘IBM PC’
DA2 DB 0AH, 0DH
COUNT EQU $-DA1
DATA ENDS
END
(2)输⼊有错误的⽂件,修改错误语句。

(MASM没有出现错误即可。

不必连接、运⾏。


DATA SEGMENT
VAR1 DB 0, 25, ODH, 300
VAR2 DB 12H, A4H, 6BH
VAR3 DB ’ABCDEF’
VAR4 DW 1234H, 5678H
VAR5 DW 10H DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS: CODE, DE: DATA
BEING MOV AX, DATA
MOV DS, AX
LEA SI, VAR5
MOV BX, OFFSET VAR2
MOV [SI], 0ABH
MOV AX, VAR1+2
MOV [BX], [SI]
MOV VAR5+4, VAR4
MOV AH, 4CH
INT 21H
CODE ENDS
END START
(3)输⼊正确的程序,汇编、连接、运⾏
STACKS SEGMENT STACK
DW 128 DUP(?)
STACKS ENDS
DATAS SEGMENT
STRING DB ‘WELCOME!’, 13, 10, ‘$’
DATAS ENDS
CODES SEGMENT
ASSUME CS: CODES, DS: DATAS
START:MOV AX, DATAS
MOV DS, AX
LEA DX, STRING
MOV AH, 9
INT 21H
MOV AH, 4CH
INT 21H
CODES ENDS
END START
4.算法描述及实验步骤
1) ⾸先,⽤记事本输⼊各段程序,并储存成源程序,保存在MASM⽬录下。

2)对源程序进⾏汇编、连接。

操作如下:
(1)在DOS状态下,进⼊MASM⽬录;
(2)输⼊命令:MASM ⽂件名
(3)在系统出现的提⽰中输⼊:
object filename[.obj]: 按回车键。

source listling[nul.lst]: 输⼊:⽂件名,⽣成list⽂件。

cross-reference [nul.crf]: 按回车键。

(4)如果系统没有提⽰出错,那么汇编过程就完成了。

如果提⽰错误则应打开源⽂件进⾏修改,然后再重复(2)和(3)步骤。

(5)输⼊:LINK ⽂件主名
run file [.exe]: 按回车键。

list file [nul.map]: 按回车键。

libraries [.lib]: 按回车键。

(6)如果没有提⽰错误,汇编过程就结束了。

产⽣了.exe可执⾏⽂件。

3) 执⾏程序(由DOS中的COMMAND命令将⽂件加载⼊内存),在DOS提⽰符下直接输⼊⽂件主名执⾏⽂件。

5.调试过程
1
2
修改前的调试结果:
修改后的调试结果:
3
6. 实验结果
1、
DA1,DA2的偏移量分别是0020和0026。

COUNT的值为0008。

2、①VAR1 DB 0,25, ODH,300 改为VAR1 DB 0,25,0DH,30
②ASSUME CS:CODE,DE:DATA 改为ASSUME CS:CODE,DS:DATA
③BEING MOV AX,DATA改为BEING: MOV AX,DATA
④MOV [SI],0ABH改为MOV SI,0ABH
⑤MOV AX, VAR1+2改为MOV AX,WORD PTR [VAR1+2]
⑥MOV [BX],[SI]改为MOV [BX],SI
⑦MOV VAR5+4,VAR4改为MOV AX,VAR4
⑧END START去掉START
3. 运⾏结果是输出WELLCOME!
7. 总结
通过在机房的实际操作,可以熟练编写源程序,但对汇编伪指令语句的理解不够,同时在汇编程序的执⾏过程中,对DEBUG 的命令的运⽤掌握不够,课外需要多加练习。

附录:
2、DATA SEGMENT
VAR1 DB 0,25,0DH,30
VAR2 DB 12H,0A4H,6BH
VAR3 DB 'ABCDEF'
VAR4 DW 1234H,5678H
VAR5 DW 10H DUP(?)
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
BEING:MOV AX,DATA
MOV DS,AX
LEA SI,VAR5
MOV BX,OFFSET VAR2
MOV BYTE PTR [SI],0ABH
MOV AX,WORD PTR [VAR1+2]
MOV BX,[SI]
MOV AX,VAR4
MOV VAR5,AX
MOV AH,4CH
INT 21H
CODE ENDS
END
福建农林⼤学⾦⼭学院实验报告
系:专业:年级:姓名:学号:实验课程:汇
编语⾔
实验室号:____1#605___ 实验设备号: I3 实验时间: 2011.5.9 指导教师签字:成绩:
实验⼆顺序程序设计
1.实验⽬的和要求
1.学习使⽤DEBUG的命令;
2.使⽤DEBUG命令在数据段中查看程序运⾏的结果;
3.利⽤DEBUG运⾏简单的程序段。

2.实验环境
实验的硬件环境是:
IBM—PC机及其兼容机
实验的软件环境是:
操作系统:DOS 2.0以上;调试程序:/doc/aa5b4424a5e9856a56126062.html ;⽂本编程程序:EDIT.EXE、
WPS.EXE;宏汇编程序:MASM.EXE(或ASM .EXE);连接装配程序:LINK .EXE;
交叉引⽤程序:CREF.EXE(可有可⽆)。

3.实验内容及实验数据记录
1)输⼊程序观察寄存器变化
使⽤DEBUG,将下⾯的程序段写⼊内存,逐条执⾏,观察每条指令执⾏
后,CPU中相关寄存器的内容变化。

注意⽤T命令执⾏时,CS: IP寄存器的内容MOV AX, 4E20
ADD AX, 1416
MOV BX, 2000
ADD AX, BX
MOV BX, AX
ADD AX, BX
MOV AX, 001A
MOV BX, 0026
ADD AL, BL
ADD AH, BL
ADD BH, AL
MOV AH, 0
ADD AL, BL
ADD AL, 9C
2)下列程序单步运⾏,注意AL,BX,CX寄存器的变化,并观察数据段字母的变化。

DSEG SEGMENT
MSG1 DB ‘abc’
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
LEA BX, MSG1
MOV CX, 3
S: MOV AL, [BX]
AND AL, 11011111B ;将AL中的ASCII码的第5位置0,
;变成⼤写字母。

MOV [BX], AL
INC BX
LOOP S
MOV AL, 0
MOV AH, 4CH
INT 21H
CSEG ENDS
END START
3)程序的跟踪执⾏操作
在DOS 下直接输⼊⽂件主名就可以执⾏⽂件了,有的程序会显⽰结果,可能执⾏后什么结果都没有,是因为程序中没有显⽰命令。

那么如何查看程序的运⾏结果呢?
程序执⾏过程的跟踪操作步骤如下:(1)在DOS 下输⼊:DEBUG ⽂件名.EXE (2)在DEBUG 提⽰符下输⼊U 命令
(3)可以⽤T 命令单步执⾏指令,执⾏到 MOV AH, 4CH 时结束,也可以⽤G 命令执⾏整个程序,输⼊:G=B 地址(如:
G=0000)
(4)⽤D 命令查看程序执⾏后数据段的变化输⼊:D K 地址:0 (如:D1260:0)
在显⽰的数据中,对照源程序或LST ⽂件查看结果所在的偏移地址的内容。

4)编写调试下⾯的程序,⽤DEBUG 查看数据段中的结果
(1))/()510*)((Y X X W Z ++-=,X ,Y ,W 为字节类型变量,结果存于Z 单元,写出数据段和代码段。

(2)X ,Y 为字节类型数,求16/)2*)(8*)((Y X Y X Z --+=,写出完整的数据段和代码段,不⽤乘除指令。

4.算法描述及实验步骤 1.输⼊程序观察寄存器变化
⽅法:使⽤DEBUG ,将程序段写⼊内存,逐条执⾏,观察每条指令执⾏后,CPU 中相关寄存器的内容变化。

使⽤T 命令进⾏跟踪查看,观察CS: IP 寄存器的内容。

2. 下列程序单步运⾏
思路分析:修改前得出的结论是将⼩写字母改写成⼤写字母。

⽤的是逻辑与运算,此时赋给AL 寄存器的内容是11011111B.修改后的出的结论是将⼤写字母改写成⼩写字母,⽤的是逻辑或运算,此时赋给AL 寄存器的内容是11011111B 的反码00100000B.在记事本中输⼊程序,将程序中的MSG1 DB ‘abc ’改为MSG1 DB ‘ABC ’;AND AL,11011111B 改为OR
AL,00100000B. 在DOS 中进⾏汇编连接,⽣成.exe ⽂件后,使⽤U 命令进⾏反汇编,⽤D 命令现实存储单元内容,G 命令运⾏程序,再⽤D 命令现实存储单元内容。

3、编写调试下⾯的程序,⽤DEBUG 查看数据段中的结果
操作⽅法:输⼊程序,在DOS 中进⾏汇编连接,⽣成.exe ⽂件后,使⽤U 命令进⾏反汇编,G 命令运⾏程序,⽤D 命令现实存储单元内容。

1))/()510*)((Y X X W Z ++-=,X ,Y ,W 为字节类型变量,结果存于Z 单元,写出数据段和代码段。

(1)分析问题:设W ,X ,Y 的值存放在字节变量W ,X ,Y 中,再定义⼀个字节变量T 来存放数据10,结果存放在字变量Z 中。


(3)程序的编写如下: data segment x db 26 y db 23 w db 126 z db ? data ends code segment
assume cs:code,ds:data start : mov ax,data
mov ds,ax mov al,w sub al,x mov bh,10 mul bh add ax,5 mov bl,x add bl,y div bl mov z,al mov z+1,ah mov ah,4ch int 21h code ends end start
(4)程序运⾏结果见实验结果。

2)X ,Y 为字节类型数,求16/)2*)(8*)((Y X Y X Z --+=,写出完整的数据段和代码段,不⽤乘除指令。

(1)分析问题:设X ,Y 的值存放在字节变量X ,Y 中,结果存放在字变量Z 中。

①初始化;②⽆符号数相加ADD ,两操作数位数需⼀致, X 为字节类型,把X+X 的值存于AL 中;③⽆符号数乘法,运⽤算术左移来完成,此时要求乘以8,则需左移三位,由于移位指令的格式,因此需把所移动的位数(此时移动位数为3)放⼊CL 中,即“MOV CL,3”再运⽤“ SAL AL,CL ”来完成;④⽆符号数相减SUB ,X-Y 存⼊BL 中;⑤⽆符号数相乘,同③,运⽤“MOV CL,1”“SAL AL,CL ”来完成;⑥⽆符号数除法,运⽤算术右移来完成,此时要求除以16,则需右移四位,由于移位指令的格式,因此需把所移动的位数(此时移动位数为4)放⼊CL 中,即“MOV CL,4”再运⽤“ SAR AL,CL ”来完成;⑦把AL 的值送⼊Z 。

(2
(3
data segment
x db 26
y db 23
z db ?
data ends
code segment
assume cs:code,ds:data start : mov ax,data
mov ds,ax
mov al,x
add al,y
mov cl,3
shl al,cl
mov bl,x
sub bl,y
shl cl,1
sub bl,cl
mov cl,4
shr al,cl
mov z,al
mov z+1,ah
mov ah,4ch
int 21h
code ends
end start
(4)程序运⾏结果见实验结果。

5.调试过程2、
1)输⼊程序观察寄存器变化
2)下列程序单步运⾏
修改前:
修改后:
4)输⼊下⾯的程序,按实验⼀和上⾯的步骤运⾏⼀遍
3、编写调试下⾯的程序,⽤DEBUG查看数据段中的结果1)
2)
6. 实验结果
2、实验内容
1)输⼊程序观察寄存器变化
总结:按U命令,可显⽰该⽂件的反汇编程序,并可看出CS:IP在计算机中的机器码内容显⽰,进⼀步执⾏T命令之后,每执⾏⼀条指令下来,可以发现IP会⾃动加上下⼀条MOV语句即将执⾏的内容。

2)下列程序单步运⾏
修改前:
由上图可知,数据段字母由⼩写字母abc改成⼤写字母ABC。

修改后:
由上图可知,数据段字母由⼤写字母ABC改成⼩写字母abc。

4)输⼊下⾯的程序,按实验⼀和上⾯的步骤运⾏⼀遍
由上图可知,结果存放在MSG2单元中,偏移地址为0004H.值为2010H
3、编写调试下⾯的程序,⽤DEBUG查看数据段中的结果
1)
结果分析:由程序中可得到X=26,Y=23,W=126,所以的出 Z=1005/49=20,余
数为25,分别转换为⼗六进制数为14H,19H,与上图中的结果相对应,符合题意。

2)
结果分析:同上可得,Z的⼗六进制为图中的08H,余数为图中的14H.
7. 总结
通过进⼀步学习了DEBUG的命令,我学会了使⽤DEBUG命令在数据段中查看程序运⾏的结果,学会了利⽤DEBUG命令运⾏简单的程序段。

附录:
将⼤写字母改成⼩写字母的代码如下:
DSEG SEGMENT
MSG1 DB 'ABC'
DSEG ENDS
CSEG SEGMENT
ASSUME CS: CSEG, DS: DSEG
START: MOV AX, DSEG
MOV DS, AX
LEA BX, MSG1
MOV CX, 3
S: MOV AL, [BX]
OR AL, 00100000B ;将AL中的ASCII码的第5位置1, ;变成⼩写字母。

MOV [BX], AL
INC BX
LOOP S
MOV AL, 0
MOV AH, 4CH。

相关文档
最新文档