河北工业大学实验报告.docx
《河北工业大学实验报告.docx》由会员分享,可在线阅读,更多相关《河北工业大学实验报告.docx(58页珍藏版)》请在冰豆网上搜索。
![河北工业大学实验报告.docx](https://file1.bdocx.com/fileroot1/2023-3/1/5a202cc8-ece3-4726-b533-3160bd7e8e66/5a202cc8-ece3-4726-b533-3160bd7e8e661.gif)
河北工业大学实验报告
汇编语言程序设计实验
实验一顺序与分支程序设计
一、实验目的
1)掌握顺序程序设计方法。
2)掌握分支程序的结构及分支程序的设计,调试方法。
2)学习数据传送及算术和逻辑运算指令的用法。
3)熟悉在pc机上建立、汇编、连接、调试和运行汇编语言程序的过程。
二、实验内容
1)有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。
EXAM1-1
DATASEGMENT
BUF1DW9348H
BUF2DW4DUP(0),0AH,0DH,‘$’
BUF3DW4DUP(0),‘$’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
BEGIN:
MOVAX,DATA
MOVDS,AX
MOVAX,BUF1
ADDAX,0
JSNEXT
MOVBUF2,AX
MOVBUF3,AX
JMPEEE
NEXT:
ANDAX,7FFFH
NOTAX
MOVBUF2,AX
INCAX
MOVBUF3,AX
EEE:
MOVCX,0004H
MOVDI,OFFSETBUF2
MOVDX,[DI]
ADDDI,03
BBB:
MOVAX,DX
ANDAX,000FH
CMPAL,0AH
JBQQQ
ADDAL,07H
QQQ:
ADDAL,30H
MOV[DI],AL
DECDI
PUSHCX
MOVCL,04H
SHRDX,CL
POPCX
LOOPBBB
MOVCX,0004H
MOVSI,OFFSETBUF3
MOVDX,[SI]
ADDSI,03H
CCC:
MOVAX,DX
ANDAX,000FH
CMPAL,0AH
JBDDD
ADDAL,07H
DDD:
ADDAL,30H
MOV[SI],AL
DECSI
PUSHCX
MOVCL,04H
SHRDX,CL
POPCX
LOOPCCC
MOVDX,OFFSETBUF2
MOVAH,09H
INT21H
MOVDX,OFFSETBUF3
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
执行程序EXAM1-1·EXE,屏幕上显示结果:
ECB7
ECB8
2)有两个两字节无符号数分别放在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上显示。
相加若有进位不存入存储单元。
EXAM1-2
DATASEGMENT
ADB34H,18H,2DUP(0),’$’
BDB56H,83H
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAL,A
MOVBL,B
ADDAL,BL
MOVAH,A+1
MOVBH,B+1
ADCAH,BH
MOVA,AL
MOVA+1,AH
MOVCX,0004H
MOVDI,OFFSETA
MOVDX,[DI]
ADDDI,03
NEXT:
MOVAX,DX
ANDAX,000FH
CMPAL,0AH
JBQQQ
ADDAL,07H
QQQ:
ADDAL,30H
MOV[DI],AL
DECDI
PUSHCX
MOVCL,04
SHRDX,CL
POPCX
LOOPNEXT
MOVDX,OFFSETA
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
执行程序EXAM1-2·EXE,屏幕上显示结果:
9B8A
3)在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示。
STACKSEGMENTSTACK
DB1024DUP(0)
STACKENDS
DATASEGMENT
BUFDB70H,35H,1FH
MAXDB2DUP(?
),‘$’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
BEGIN:
MOVAX,DATA
MOVDS,AX
MOVAL,BUF
CMPAL,BUF+1
JNBLP1
MOVAL,BUF+1
LP1:
CMPAL,BUF+2
JAELP2
MOVAL,BUF+2
LP2:
MOVCX,02H
MOVDI,OFFSETMAX
MOVDL,AL
INCDI
LP3:
ANDAL,0FH
CMPAL,0AH
JBLP4
ADDAL,07H
LP4:
ADDAL,30H
MOV[DI],AL
DECDI
PUSHCX
MOVCL,04
SHRDL,CL
POPCX
MOVAL,DL
LOOPLP3
MOVDX,OFFSETMAX
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
执行程序EXAM1-3·EXE,屏幕上显示结果:
70
4)要求同上,只是比较的数为有符号数。
EXAM1-4
STACKSEGMENTSTACK
DB1024DUP(0)
STACKENDS
DATASEGMENT
BUFDB98H,75H,32H
MAXDB2DUP(?
),‘$’
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
BEGIN:
MOVAX,DATA
MOVDS,AX
MOVAL,BUF
CMPAL,BUF+1
JGLP1
XCHGAL,BUF+1
LP1:
CMPAL,BUF+2
JGLP2
XCHGAL,BUF+2
LP2:
MOVMAX,AL
MOVCX,02H
MOVDI,OFFSETMAX
MOVDL,[DI]
INCDI
LP3:
MOVAL,DL
ANDAL,0FH
CMPAL,0AH
JBLP4
ADDAL,07H
LP4:
ADDAL,30H
MOV[DI],AL
DECDI
PUSHCX
MOVCL,04
SHRDX,CL
POPCX
LOOPLP3
MOVDX,OFFSETMAX
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
执行程序EXAM1-4·EXE,屏幕上显示结果:
75
5)将1000H单元开始的10个字节数,采用奇偶校验,将奇数在前偶数在后仍存回原数据区。
本实验要求在DEBUG调试状态下进行,包括汇编程序、运行程序、检查结果。
EXAM1-5
ORG2000H
2000BE0010MOVSI,1000
2003BF0910MOVDI,1009
20068A14MOVDL,[SI]
200880C200ADDDL,00
200B7B0BJPO2018
200D8615XCHGDL,[DI]
200F8814MOV[SI],DL
20114FDECDI
201239FECMPSI,DI
20147407JE201D
2016EBF0JMP2008
201846INCSI
20198A14MOVDL,[SI]
201BEBF5JMP2012
201DF4HLT
6)
从键盘上接收一位十进制数x,计算y值,并以十六进制形式显示出来,y按下列公式计算。
实验六
DATESEGMENT
XDB?
DATEENDS;数据段
CODESEGMENT
ASSUMECS:
CODE,DS:
DATE
START:
MOVAX,DATE;代码段
MOVDS,AX;初始化ds寄存器
MOVAH,1
INT21H;读文件到缓冲区
CMPAL,33H;比较指令
JBL0;A
CMPAL,36H
JAL0
ANDAL,0FH;逻辑与指令
MOVX,AL;al给x
MOVAL,X
CMPAL,3H
JEL1;执行L1命令
CMPAL,4H
JEL4;执行L4命令
CMPAL,5H
JEL6;执行L6命令
CMPAL,6H
JEL7;执行L7命令
L1:
MULAL
ADDAL,X;al+x
L5:
MOVBL,AL
MOVCL,4
SHRAL,CL;移位指令
CMPAL,9
JLEL2;转移指令。
小于或等于,或者不大于则转移
ADDAL,7
L2:
ADDAL,30H;寄存器al加0x30
MOVDL,AL
MOVAH,2;把2放入ah里
INT21H
ANDBL,0FH;逻辑与运算指令
CMPBL,9
JLEL3
ADDBL,7;相加
L3:
ADDBL,30H
MOVDL,BL
MOVAH,2
INT21H
JMPL0
L4:
MULAL
SUBAL,X
SUBAL,X
JMPL5
L6:
MULAL
JMPL5
L7:
MULAL
SHRAL,1
JMPL5
L0:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
7)
实验内容:
从键盘上接收两个一位十六进制数x和y,然后再输入一个a-d之间的一个字符,按下列要求计算。
a)当输入字符为a,则计算x+y,并以十六进制形式显示出来
b)当输入字符为b,则计算|x-y|,并以十六进制形式显示出来
c)当输入字符为c,则计算x*y,并以十六进制形式显示出来
d)当输入字符为d,则计算x/y,并以十六进制形式显示出来
实验七
DATASEGMENT
XDB0
YDB0
WDB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
XORAX,AX
MOVAH,1
INT21H
CMPAL,39H
JBEL1
SUBAL,07H
L1:
SUBAL,30H
MOVX,AL
MOVAH,1
INT21H
CMPAL,39H
JBEL2
SUBAL,07H
L2:
SUBAL,30H
MOVY,AL
MOVAH,1
INT21H
A:
CMPAL,41H
JNEB
XORAL,AL
MOVAL,X
ADDAL,Y
MOVW,AL
JMPL3
B:
CMPAL,42H
JNEC
XORAL,AL
MOVAL,X
SUBAL,Y
MOVW,AL
CMPAL,0
JGL3
NEGAL
MOVW,AL
JMPL3
C:
CMPAL,43H
JNED
XORAL,AL
MOVAL,X
MULY
MOVW,AL
JMPL3
D:
XORAX,AX
MOVAL,X
DIVY
MOVW,AL
L3:
MOVDL,AL
MOVCL,4
SHRDL,CL
CMPDL,9
JNAL4
ADDDL,07H
L4:
ADDDL,30H
MOVAH,02H
INT21H
MOVDL,W
ANDDL,0FH
CMPDL,9
JNAL5
ADDDL,07H
L5:
ADDDL,30H
MOVAH,02H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
实验七结果
3、实验心得:
(1)通过实验使我知道了和熟悉了汇编程序设计的步骤
1.建立数学模型遇到一个题目,首先要进行全面的分析,根据问题提出的条件,特点,找出规律,找出问题的数学模型或者制定解决问题的规律。
2.绘制程序流程图流程图能够把比较抽象的问题变得而形象化,并且有助于理清楚思路,便于程序的编制,在程序的易读性和易维护性上有很大的帮助。
3.合理分配存储空间和寄存器汇编语言能够直接的调用存储器和寄存器。
程序运行时,大两量的数据,中间结果或最后的结果都存放在存储器中,且运行的程序目标代码在存储器中,节约空间是一个好的程序应该注意的问题。
4.编制程序根据语法指令编制程序
5.人工检查用人工的方式检查程序是否有错,并及时的改正。
6.上机调试只有通过上机才能验证程序是否正确,经过反复的运行调试,才能得到正确的程序。
(2)掌握了分支程序的结构及分支程序的设计,调试方法和数据传送及算术和逻辑运算指令的用法。
实验二循环与子程序程序设计
一、实验目的
1)加深对循环结构的理解。
2)掌握循环程序的设计方法。
3)学习子程序的定义和调用方法。
4)掌握子程序、子程序的嵌套、递归子程序的结构。
5)掌握子程序设计、编制及调试。
6)熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
二、实验内容
1)编制在屏幕上显示九九乘法表的程序。
2)编制在屏幕上显示用*组成的三角形的程序。
3、实验代码
实验一
DATASEGMENT
S2DB?
S1DB?
XDB1
YDB1
SDB0AH
FCH=2AH
FDH=3DH
FKG=20H
FHH=0AH
FHC=0DH
DATAENDS
STACK1SEGMENTSTACK
DB20HDUP(0)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
MOVCL,9
LL1:
PUSHCX;将CL压入堆栈段
MOVCL,Y
LL2:
CALLL1;调用子程序L1
INCX
LOOPLL2
MOVX,1
INCY
MOVDL,FHH;输出换行和回车
MOVAH,2
INT21H
MOVDL,FHC
MOVAH,2
INT21H
POPCX;从堆栈段中取出CL
LOOPLL1
MOVAH,4CH;程序结束
INT21H
L1PROC;计算X*Y=Z并且输出X*Y=Z的子程序
MOVDL,X
ADDDL,30H
MOVAH,2
INT21H
MOVDL,FCH
MOVAH,2
INT21H
MOVDL,Y
ADDDL,30H
MOVAH,2
INT21H
MOVDL,FDH
MOVAH,2
INT21H
MOVAL,X
MULY
DIVS
MOVS1,AH
ADDAL,30H
MOVDL,AL
MOVAH,2
INT21H
ADDS1,30H
MOVDL,S1
MOVAH,2
INT21H
MOVDL,FKG;输出空格
MOVAH,2
INT21H
RET
L1ENDP;子程序结束
CODEENDS
ENDSTART
实验二
DATASEGMENT
NDB?
FCH=2AH
FDH=3DH
FKG=20H
FHH=0AH
FHC=0DH
DATAENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAH,1;输入一位16进制数确定输出行数INT21HCMPAL,39HJBEL1SUBAL,07H
L1:
SUBAL,30HMOVN,AL
XORBX,BX
MOVDL,FCH
MOVCL,N
MOVDL,FHH;输出换行和回车
MOVAH,2
INT21H
MOVDL,FHC
MOVAH,2
INT21H
LOP:
PUSHCX
INCBL
MOVCL,BL
MOVDL,FCH
LOP2:
MOVAH,02H
INT21H
LOOPLOP2
POPCX
MOVDL,0AH
MOVAH,02H
INT21H
MOVDL,FHC
MOVAH,02H
INT21H
CMPBL,9
JZL2
LOOPLOP
L2:
MOVAH,4CH;程序结束
INT21H
CODESENDS
ENDSTART
4、实验结果:
实验一结果
实验二结果
5、实验心得
6、循环程序由初始化部分、循环部分、调整部分、控制部分组成
1〉两种方式,一种是先判断在执行,另一种是先执行再判断。
2〉两种控制循环的方式
a〉计数控制循环
一般使用LOOP指令,要先将循环的次数放入CX中,在多重循环的计数控制中要注保存和复原上一次循环的断点信息,在保留和复原时可以使用堆栈进行处理。
自认为可以理解为一根盘绕了确定的圈数的绳子,又进入的头,又出去的尾。
b〉条件控制循环
一般使用JMP指令使程序跳到这一段的开头,用CMP在循环中进行比较判断,再根据程序要求,选择适当的转移条件,跳出循环。
自认为可以理解为一圆形的导轨,并在导轨上设置一个初口,在符合条件时就在导轨上脱离,否则,将会在导轨上一直的转下去。
3〉再循环中可以同时使用两者,当即已知循环的次数限制范围,但又要求在符合条件时结束循环是,就要同时使用两者。
7、子程序的使用大大的简化了程序设计的思路,在完成一个程序时,可以简单的把一个程序划分为几个完整的几部分,使每一部分独立的完成特定的一部分和计算任务。
子程序的使用还可以大大的减小程序的体积,在一程序中,如果需要多次反复的是用某一段代码的话,就可以将这段代码设定为子程序,以后想使用时,只要一CALL再一RET就OK啦。
我认为使用子程序的关键在于明白子程序的机理,明白子程序是如何保存和恢复断点的信息的,只有真正的理解了这一点才能更好地利用好子程序。
子程序的参数传递的方式有很多种,但是在堆栈段传递参数时,应该注意使用带立即数的返回的方式,在利用寄存器BP访问堆栈段来取得参数。
实验三算术运算与代码转换程序设计
一、实验目的
1)掌握算术运算程序的设计方法。
2)掌握代码转换程序的设计方法。
3)进一步掌握各种程序结构。
4)熟练掌握和使用用DEBUG调试程序。
二、实验内容
1)编制两个多字节整数加法和减法程序,并将结果按十六进制形式显示在屏幕上。
2)编写程序计算从键盘输入两个不超过四位的十进制数的和、差、积、商,并以十进制形式输出。
3)编写程序把从键盘输入的以回车为结束符的字符串中的空格去掉并按相反的顺序输出。
三实验代码、
实验1
DATASEGMENT
NUM1DB22H,33H,44H,55H,66H,77H
NUM1LDB6H
NUM2DB22H,22H,22H,22H
NUM2LDB4H
OUTCOME1DB10HDUP(0)
OUTCOME2DB10HDUP(0)
NDB0H
DATAENDS
STACK1SEGMENTPARASTACK
DW20HDUP(0)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
MOVCH,0
MOVSI,OFFSETNUM1
MOVDI,OFFSETNUM2
MOVAH,NUM1L
MOVAL,NUM2L
CMPAH,AL
JAECHA
XCHGSI,DI
XCHGAH,AL
CHA:
SUBAH,AL
MOVCL,AL
CLC
MOVBX,OFFSETOUTCOME1
LOP1:
MOVAL,[DI]
PUSHCX
MOVCL,[SI]
ADCCL,AL
MOV[BX],CL
INCBX
INCSI
INCDI
POPCX
LOOPLOP1
MOVCL,AH
JCXZLOP3
LOP2:
PUSHCX
MOVCL,BYTEPTR[SI]
ADCCL,0
MOV[BX],CL
POPCX
INCBX
INCSI
LOOPLOP2
LOP3:
MOVCH,0
MOVSI,OFFSETNUM1
MOVDI,OFFSETNUM2
MOVAH,NUM1L
MOVAL,NUM2L
CMPAH,AL
JAECHA1
XCHGSI,DI
XCHGAH,AL
CHA1:
SUBAH,AL
MOVCL,AL
CLC
MOVBX,OFFSETOUTCOME2
LOP11:
MOVAL,[DI]
PUSHCX
MOVCL,[SI]
SBBCL,AL
MOV[BX],CL
INCBX
INCSI
INCDI
POPCX
LOOPLOP11
MOVCL,AH
JCXZLOP7
LOP21:
PUSHCX
MOVCL,BYTEPTR[SI]
SBBCL,0
MOV[BX],CL
POPCX
INCBX
INCSI
LOOPLOP21
LOP7:
MOVDI,OFFSETOUTCOME1
ADDDI,10H
MOVCX,11H
LOP4:
MOVDL,[DI]
DECDI
CMPN,0H
JNELOP5
CMPDL,0H
JELOP9
LOP5:
PUSHDX
PUSHCX
MOVCL,4H
SHRDL,CL
POPCX
CMPDL,9H
JBELOP6