汇编实验报告.docx
- 文档编号:12855818
- 上传时间:2023-06-08
- 格式:DOCX
- 页数:82
- 大小:454.28KB
汇编实验报告.docx
《汇编实验报告.docx》由会员分享,可在线阅读,更多相关《汇编实验报告.docx(82页珍藏版)》请在冰点文库上搜索。
汇编实验报告
实验一:
DOS环境下的汇编语言编程环境使用
一.实验要求和目的
1、掌握汇编语言程序设计的基本流程和学会上机开发简单程序;
2、熟练掌握宏汇编程序MASM的使用;
3、熟练掌握连接程序LINK的使用;
4、熟练掌握DEBUG的使用;
二.软硬件环境
1、硬件环境:
计算机系统windows;
2、软件环境:
装有MASM、DEBUG、LINK、等应用程序。
三.实验涉及的主要知识
汇编语言程序设计上机开发过程如图1.1所示。
四.实验内容与步骤
1、汇编、链接并调试给出的简单程序,找出程序中的错误。
(一)录入并建立汇编语言源程序文件(ASM文件)
(2)用汇编程序MASM将ASM文件汇编成目标程序文件(OBJ文件)
(3)用连接程序LINK生成可执行程序文件(EXE文件)
(4)程序的调试
2、完成程序设计:
分类统计字数组data中正数、负数和零的个数,并分别存入内存字变量Positive、Negative和Zero中,数组元素个数保存在其第一个字中。
使用Debug查看Positive、Negative和Zero三个变量的数据。
五.实验过程及结果
1.
(1)代码:
DATASSEGMENT
word1DW1,9078H
byte1DB21,'World'
DD12345678H
MsgDB'Hello,everyone!
$';此处输入数据段代码
DATASENDS
STACKSSEGMENT
stadw20dup(?
)
topequsizesta;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
;此处输入代码段代码
MOVDX,OFFSETMsg
MOVAH,9
INT21h
Nop
MOVAX,0
MOVBX,1H
ADDITION:
ADDAX,BX
INCBX
COMPBX,10
JAEADDITION
MOVAH,4ch
INT21h
CODESENDS
ENDSTART
(2)在生成OBJ文件过程中出现了几个问题:
错误改正:
25行的ADDITION后边加的是中文冒号,导致语法错误,改为英文冒号。
28行的com指令错误,应该改为cmp
29行的jae逻辑错误,改为jnz
(3)改正错误之后:
成功运行。
(4)进行DEBUG调试
2.
(1)
代码:
DATASSEGMENT
countdw8
datadw-1,-2,-3,0,1,3,0,-5
positivedw0
negativedw0
zerodw0;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
movbx,0
movcx,count
AGAIN:
movax,data[bx]
cmpax,0
jze
jss
jnsl
e:
inczero
addbx,2
jmpk
s:
incnegative
addbx,2
jmpk
l:
incpositive
addbx,2
k:
loopAGAIN
movax,zero
movbx,positive
movcx,negative;此处输入代码段代码
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(2)程序结果及调试
所以在给出的8个数里,正数是2个,负数是2个,零有4个。
(3)流程图
6.实验感想
本次实验是我们第一次使用汇编语言进行编程实验,实验过程中出现了许多问题,没有得到带有的结果,但是在老师的帮助下还是一步一步搞懂了问题的所在,解决了问题。
汇编语言还是要多练习。
实验二:
算术运算类操作实验
一.实验要求和目的
1.了解汇编语言中的二进制、十六进制、十进制、BCD码的表示形式;
2.掌握各类运算类指令对各状态标志位的影响及测试方法;
3.熟悉汇编语言二进制多字节加减法基本指令的使用方法;
4.熟悉无符号数和有符号数乘法和除法指令的使用;
5.掌握符号位扩展指令的使用;
6.掌握BCD码调整指令的使用方法。
二.软硬件环境
1.硬件环境:
计算机系统windows;
2.软件环境:
装有MASM、DEBUG、LINK、等应用程序。
三.实验涉及的主要知识
本实验主要进行算术运算程序设计和调试,涉及到的知识点包括:
1.加减法处理指令
主要有加法指令ADD,带进位加法ADC,减法指令SUB,带进位减法指令SBB。
2.乘除法指令和符号位扩展指令
主要有无符号数乘法指令MUL,带符号数乘法指令IMUL,无符号数除法指令DIV,带符号数除法指令IDIV,以及符号位从字节扩展到字的指令CBW和从字扩展到双字的指令CWD。
3.BCD码的调整指令
主要有非压缩的BCD码加法调整指令DAA,压缩的BCD码减法调整指令DAS,非压缩的BCD码加法调整指令AAA,非压缩的BCD码减法调整指令AAS,乘法的非压缩BCD码调整指令AAM,除法的非压缩BCD码调整指AAD。
8088/8086指令系统提供了实现加、减、乘、除运算的上述基本指令,可对下表所示的数据类型进行数据运算。
数制
二进制
BCD码
带符号
无符号
组合
非组合
运算符
+、-、×、÷
+、-
+、-、×、÷
操作数
字节、字、多精度
字节(二位数字)
字节(一位数字)
四.实验内容
1.对于两组无符号数,087H和034H,0C2H和5FH,试编程求这两组数的和差积商,并考虑计算结果对标志寄存器中状态标志位的影响。
(1)流程图
开始
ax->first
bx>second
AX=AL+BL
Ax=ax-bx
Ax=ax*bx
Ax=ax/bx
结束
重复两遍,取third和forth
(2)代码:
DATASSEGMENT
firstdw087H
seconddw034H
thirddw0c2H
forthdw05FH
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
movax,first
movbx,second
addax,bx
movax,first
subax,bx
movax,first
mulbx
movax,first
divbx
movax,third
movbx,forth
addax,bx
movax,third
subax,bx
movax,third
mulbx
movax,third
divbx
;此处输入代码段代码
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(3)实验结果:
计算
状态标志
表达式
结果
CF
AF
ZF
OF
SF
PF
087H+034H
BBH
0
0
0
0
0
1
087H-034H
53H
0
0
0
0
0
1
087H*034H
1B6CH
0
0
0
0
0
0
087H/034H
2H
0
0
0
0
0
0
0C2H+5FH
121H
0
1
0
0
0
1
0C2H-5FH
63H
0
1
0
0
0
1
0C2H*5FH
47FEH
0
0
0
0
0
0
0C2H/5FH
2H
0
0
0
0
0
0
2.在数据段定义了两个多精度的有符号16进制数,FIRST和SECOND,1)求两数的和与差,并将结果存放在THIRD为首地址的缓冲区中;2)如果把两组数据当作十进制数据来处理,再次求两数的和与差,并将结果存放在FORTH为首地址的缓冲区中。
试编程实现上述运算。
(1)流程图
开始
AX=0
SI=0
DI=0
CX=4
AX=[FIRST+SI]
BX=[SECOND+SI]
AX=AX+BX
[THIRD+DI]<-AX
DI=DI+2
AX=[FIRST+SI]
AX=AX-BX
[THIRD+DI]<-AX
SI=SI+2
DI=DI+2
CX=CX-1
NCX=0?
Y
结束
(2)
16进度加减法
代码:
DATASSEGMENT
FIRSTDB45H,82H,96H,57H
SECONDDB12H,46H,83H,45H
FORTHDB20DUP(?
);设一组数最高位在后面
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,4
;16进度加法
L:
MOVAL,FIRST[SI];取第一组数据
MOVBL,AL;保存BL
MOVAL,SECOND[SI];取第二组数
ADCAL,BL;带进位相加
MOVFORTH[SI],AL;保存结果
INCSI;取下一个地址
LOOPL
MOVSI,0
MOVCX,4
;16进制减法
L1:
MOVAL,FIRST[SI];取第一组数据
MOVBL,AL;保存BL
MOVAL,SECOND[SI];取第二组数
SBBBL,AL;带进位相减
MOVFORTH[SI+4],BL;保存结果
INCSI;取下一个地址
LOOPL1
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验结果:
(3)10进制加减法
代码:
DATASSEGMENT
FIRSTDB45H,82H,96H,57H
SECONDDB12H,46H,83H,45H
FORTHDB20DUP(?
);设一组数最高位在后面
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVSI,0
MOVCX,4
;10进度加法
L:
MOVAL,FIRST[SI];取第一组数据
MOVBL,SECOND[SI];取第二组数
ADCAL,BL;带进位相加
DAA
MOVFORTH[SI],AL;保存结果
INCSI;取下一个地址
LOOPL
MOVSI,0
MOVCX,4
;10进制减法
L1:
MOVAL,FIRST[SI];取第一组数据
MOVBL,SECOND[SI];取第二组数
SBBAL,BL;带进位相减
DAS
MOVFORTH[SI+4],AL;保存结果
INCSI;取下一个地址
LOOPL1
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(2)实验结果:
16进制结果
10进制结果
FIRST+SECOND
57C8199D
57288003
FIRST-SECOND
333C1312
32361312
5.实验心得
此次实验进一步巩固了上次程序调试编译过程的内容。
实验三:
字符串操作实验(设计性实验)
一.实验要求和目的
1.了解汇编语言字符串处理基本流程;
2.熟悉汇编语言字符串处理基本指令的使用方法;
3.掌握利用汇编语言实现字符串处理的程序设计方法。
二.主要知识
1、字符串处理基本操作流程
(1)利用SI寄存器保存源串首地址;
(2)利用DI寄存器保存目的串首地址;
(3)利用CX寄存器保存字符串长度;
(4)利用CLD或STD指令设置字符串处理方向;
(5)利用字符串处理指令实现相关处理。
2、重复前缀指令,重复次数由计数寄存器CX中存放的值决定,指令每重复执行一次,计数器CX中值减1,当CX中值减至0时,停止重复执行,继续执行下一条指令。
REP无条件重复前缀,重复串操作直到计数寄存器的内容CX为0为止。
经常与REP配合工作的字符串处理指令有MOVS、STOS和LODS。
REPE/REPZ判断计数寄存器的内容CX是否为0或ZF=0(即比较的两个操作数不等),只要满足一个则重复执行结束,否则继续执行。
可以与REPE/REPZ配合工作的串指令有CMPS和SCAS。
REPNE/REPNZ判断计数寄存器的内容是否为0或ZF=1(即比较的两个操作数相等),只要满足一个则重复执行结束,否则继续执行。
可以与REPE/REPZ配合工作的串指令有CMPS和SCAS。
3、字符串处理基本指令
(1)MOVS传送指令
格式:
MOVSDST,SRC或MOVSB(传送字节)或MOVSW(传送字)。
(2)STOS存入串指令
格式:
STOSDST或STOSB(存入字节)或STOSW(存入字)。
(3)LODS从串取指令
格式:
LODSSRC或LODSB(取字节)或LODSW(取字)。
(4)CMPS串比较指令
格式:
CMPSSRC,DST或CMPSB或CMPSW。
三.实验内容
1、比较缓冲区中两字符串是否相同,相同则AL返回0,不同AL返回1。
为了使程序的通用性比较好,字符串长度要求自动获取。
(要求用字符串处理方法)
(1)流程图
开始
COUNT1=$-STRING1
COUNT2=$-STRING2
SI->STRING1
DI->STRING2
N
COUNT1=COUNT2?
Y
CX=COUNT1
REPECMPSB
N
CX=0?
Y
AL=1
AL=0
结束
(2)
代码:
DATASSEGMENT
s1db'duanchenhui$'
cntequ$-s1
s2db'duanchenhui$'
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVES,AX
MOVCX,CNT
MOVSI,OFFSETS1
MOVDI,OFFSETS2
CLD
MOVAH,0
MOVAL,0
REPZCMPSB
JZUNMAT
MOVAL,1
UNMAT:
;此处输入代码段代码
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(3)运行结果:
若改变输入字符为:
则结果为:
2、编写程序,将内存中某一区域的数据传送到另一区域。
(要求用字符串处理方法)
(1)流程图
开始
COUNT=$-STRING1
CX=COUNT
CLD
REPMOVSB
结束
(2)
代码:
DATASSEGMENT
str1db'abcdefg'
countequ$-str1
;此处输入数据段代码
DATASENDS
copySEGMENT
str2dbcountdup(?
)
copyENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,ES:
copy
START:
MOVAX,DATAS
MOVDS,AX
moves,dx
movcx,count
cld
repmovsb;此处输入代码段代码
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(3)运行结果:
3、编写程序,在已知字符串中搜索特定字符’!
’,若找到则AL返回0,找不到AL返回1。
(要求用字符串处理方法)
(1)流程图
开始
COUNT=$-STRING
CX=COUNT
DI->STRING
AL=’!
’
DI->STRING
CLD
REPESCASB
N
ZF=0?
Y
AL=1AL=0
结束
(2)代码:
DATASSEGMENT
s1db'BIT!
5656ya'
l1equ$-s1
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
moves,ax
leadi,s1
movcx,l1
moval,'!
'
cld
repnzscasb
jznext
moval,1
jmpe
next:
moval,0
jmpe
e:
;此处输入代码段代码
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(3)运行结果:
将原字符串修改为
则运行结果为:
4、编写程序,统计一串字符串中字符"."出现的次数。
(要求用字符串处理方法)
(1)流程图
开始
COUNT=$-STRING
BX=0
DI->STRING
CX=COUNT
AL=’.’
CLD
REPNESCASB
N
ZF=0?
Y
BX=BX+1
CX=CX+1
结束
(2)
代码:
DATASSEGMENT
str1db'a2222123..efg'
countequ$-str1
pointerdbcountdup(0)
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
moves,ax
movbx,0
leadi,str1
movcx,count
moval,'.'
cld
l:
repnzscasb
jzfound
jmpdone
found:
incbx
inccx
loopl
done:
;此处输入代码段代码
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(3)运行结果:
若将输入字符串改为:
结果为:
若将输入字符串改为:
结果为:
实验四:
分支和循环程序设计实验
一.实验要求和目的
1.熟悉汇编语言程序设计结构;
2.熟悉汇编语言分支程序基本指令的使用方法;
3.掌握利用汇编语言实现单分支、双分支、多分支的程序设计方法;
4.了解汇编语言循环程序设计的基本流程;
5.熟悉汇编语言循环基本指令的使用方法;
6.掌握利用汇编语言的循环指令完成循环程序设计方法。
二.实验涉及的主要知识
1.无条件转移指令JMP
无条件转移指令JMP是使程序无条件转移至目标处,又分为段内转移、段间转移。
2.条件转移指令JXX
条件转移指令可分为三大类:
1)简单条件转移指令。
根据单个标志位的状态判断转移条件。
2)无符号数条件转移指令。
3)带符号数条件转移指令。
3.循环程序的基本结构通常由3部分组成:
建立循环初始值,为循环做准备,如设置地址指针,(BX/SI/DI/BP),初始化循环控制变量或计数器(CX),数据寄存器(AX/DX)初值等。
指令格式执行操作循环结束条件
LOOP标号CX=CX-1;若CX=0,则循环CX=0
LOOPNZ/LOOPNE标号CX=CX-1;若CX=0且ZF=0,则循环CX=0或ZF=0
LOOPZ/LOOPE标号CX=CX-1;若CX=0且ZF=1,则循环CX=0或ZF=1
JCXZ标号仅测试(CX)=0?
若等于0,则转移到目标地址,否则就顺序执行。
3.实验内容
1.判断方程AX2+BX+C=0是否有实根。
若有实根,则将字节变量tag置1,否则置0。
假设A、B、C均为字节变量,数据范围为-128~127。
(1)流程图
(2)代码:
DATASSEGMENT
ADB2
BDB4
DDB5
TAGDB1DUP(?
)
;此处输入数据段代码
DATASENDS
STACKSSEGMENT
;此处输入堆栈段代码
STACKSENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS,SS:
STACKS
START:
MOVAX,DATAS
MOVDS,AX
MOVAL,B
MOVBL,B
MULBL;求根公式第一项
MOVCL,AL;把al结果放到cl中
MOVAL,4
MOVBL,A
MULBL;计算4*a
MOVBL,D
MULBL;计算4*a*c
MOVBL,AL
MOVAL,CL
SU
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 汇编 实验 报告