汇编实验报告河北工业大学.docx
《汇编实验报告河北工业大学.docx》由会员分享,可在线阅读,更多相关《汇编实验报告河北工业大学.docx(73页珍藏版)》请在冰豆网上搜索。
汇编实验报告河北工业大学
实验一顺序与分支程序设计
一、实验目的
1)掌握顺序程序设计方法。
2)掌握分支程序的结构及分支程序的设计,调试方法。
2)学习数据传送及算术和逻辑运算指令的用法。
3)熟悉在PC机上建立、汇编、连接、调试和运行汇编语言程序的过程。
二、实验内容
1)有一字变量BUF1是以原码表示的有符号数,要求将其转换为反码和补码,分别存入BUF2和BUF3单元,并在屏幕上显示出来。
源代码:
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
运行结果:
2)有两个两字节无符号数分别放在存储单元A、B起始的缓冲器中,求其和,结果放在A起始的缓冲区并在屏幕上显示。
相加若有进位不存入存储单元。
源代码:
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
运行结果:
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
运行结果:
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
运行结果:
6)从键盘上接收一位十进制数X,计算Y值,并以十六进制形式显示出来,Y按下列公式计算。
源代码:
DATASEGMENT
XDB?
YDB?
DATAENDS
STACKSEGMENTSTACK
DW20HDUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
l0:
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
INT21H
MOVAH,1
INT21H
SUBAL,30H
MOVX,AL
CMPX,3
JZl1
CMPX,4
JZl2
CMPX,5
JZl3
CMPX,6
JZl4
CMPX,0
JZl6
JMPl0
l1:
MOVAL,X
MULX
ADDAL,X
MOVY,AL
JMPl5
l2:
MOVAL,X
MULX
SUBAL,X
SUBAL,X
MOVY,AL
JMPl5
l3:
MOVAL,X
MULX
MOVY,AL
JMPl5
l4:
MOVAL,X
MULX
MOVBL,2
DIVBL
MOVY,AL
l5:
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
INT21H
MOVDL,Y
MOVCL,4
SHRDL,CL
CMPDL,9
JLEl7
ADDDL,7
l7:
ADDDL,30H
MOVAH,2
INT21H
MOVDL,Y
ANDDL,0FH
CMPDL,9
JLEl8
ADDDL,7
l8:
ADDDL,30H
MOVAH,2
INT21H
JMPl0
l6:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
运行结果:
7)从键盘上接收两个一位十六进制数X和Y,然后再输入一个A-D之间的一个字符,按下列要求计算。
源代码:
DATASSEGMENT
xdb?
ydb?
zdb?
sdb?
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
start:
movax,datas
movds,ax
l0:
movah,1
int21h
subal,30h
movx,al
movdl,0ah
movah,2
int21h
movdl,0dh
int21h
movah,1
int21h
subal,30h
movy,al
movdl,0ah
movah,2
int21h
movdl,0dh
int21h
movah,1
int21h
movz,al
cmpz,'a'
jzl1
cmpz,'b'
jzl2
cmpz,'c'
jzl3
cmpz,'d'
jzl4
cmpz,'q'
jzl7
l1:
moval,x
addal,y
movs,al
jmpl6
l2:
moval,x
subal,y
movs,al
cmps,0
jsl5
jnsl6
l3:
moval,x
muly
movs,al
jmpl6
l4:
moval,x
movbl,y
movah,0
divbl
movs,al
jmpl6
l5:
negs
jmpl6
l6:
movdl,0ah
movah,2
int21h
movdl,0dh
int21h
movdl,s
l9:
adddl,30h
movah,2
int21h
movdl,0ah
movah,2
int21h
movdl,0dh
int21h
jmpl0
l7:
movah,4ch
int21h
CODESENDS
ENDstart
运行结果:
实验二循环与子程序程序设计
一、实验目的
1)加深对循环结构的理解。
2)掌握循环程序的设计方法。
3)学习子程序的定义和调用方法。
4)掌握子程序、子程序的嵌套、递归子程序的结构。
5)掌握子程序设计、编制及调试。
6)熟练掌握DEBUG的常用命令,学会用DEBUG调试程序。
二、实验内容
1)编制程序计算S=1+2·3+3·4+4·5+……+N(N+1)+……直到N(N+1)大于200为止,并将结果由屏幕上显示出来。
源代码:
DATASEGMENT
BUFDB'S=1+2*3+3*4+4*5+…+N(N+1)+…=','$'
RESDW4DUP(0),'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVDX,OFFSETBUF
MOVAH,09H
INT21H
MOVDX,1
MOVBL,2
NEXT:
MOVAL,BL
INCBL
MULBL
ADDDX,AX
CMPAX,200
JNANEXT
MOVCX,0004H
MOVDI,OFFSETRES
ADDDI,03H
NEXT1:
MOVAX,DX
ANDAX,000FH
CMPAL,0AH
JBNEXT2
ADDAL,07
NEXT2:
ADDAL,30H
MOV[DI],AL
DECDI
PUSHCX
MOVCL,04
SHRDX,CL
POPCX
LOOPNEXT1
MOVDX,OFFSETRES
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
运行结果:
2)将从3000H内存单元开始的100个字节存储单元全部清0。
源代码:
DATASEGMENT
ORG3000H
XDB100DUP(?
)
DATAENDS
STACKSEGMENTSTACK
DB10DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
LEASI,X
MOVCX,100
LP:
ANDBYTEPTR[SI],00H
INCSI
LOOPLP
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
运行结果:
3)编制在屏幕上显示九九乘法表的程序。
源代码:
DATASEGMENT
XDB1
YDB1
ZDB1
SDB?
YSDB?
TENDB10
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX;装入段寄存器
L1:
MOVAL,X
MULY
MOVZ,AL
CALLSC
INCY
MOVBL,X
CMPY,BL
JAL2
JMPL1;内循环
L2:
INCX
CMPX,9H
JAL3
MOVY,1
MOVDL,0AH
MOVAH,02H
INT21H
MOVDL,0DH
MOVAH,02H
INT21H;输出回车换行
JMPL1;外循环
L3:
MOVAH,4CH
INT21H
SCPROC;输出子程序
ADDY,30H
MOVDL,Y
MOVAH,02H
INT21H;输出Y
MOVDL,'X'
MOVAH,02H
INT21H;输出X
ADDX,30H
MOVDL,X
MOVAH,02H
INT21H;输出X
MOVDL,'='
MOVAH,02H
INT21H;输出=
MOVAX,0
MOVAL,Z
DIVTEN
MOVS,AL
MOVYS,AH
cmps,1
jbl10
ADDS,30H
MOVDL,S
MOVAH,2
INT21H;输出高位结果
ADDYS,30H
MOVDL,YS
MOVAH,2
INT21H;输出低位结果;输出Z
MOVDL,''
MOVAH,02H
INT21H;输出一个空格
jmpl11
l10:
ADDYS,30H
MOVDL,YS
MOVAH,2
INT21H;输出低位结果
MOVDL,''
MOVAH,02H
INT21H;输出一个空格
MOVDL,''
MOVAH,02H
INT21H
l11:
MOVAX,0
MOVAL,X-30H
SUBX,30H
SUBY,30H
RET
SCENDP
CODEENDS
ENDSTART
运行结果:
4)编制在屏幕上显示用*组成的三角形的程序
源代码:
DATASEGMENT
NDB?
NNDB?
IDB1
DATAENDS
STACKSEGMENT
DW20DUP(?
)
STACKENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVAH,1
INT21H;输入一个数存入AL
MOVN,AL;输入的数存入N
SUBN,30H
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H
L10:
MOVAL,N
SUBAL,I
MOVNN,AL
L2:
CMPNN,1
JBL1
MOVDL,''
MOVAH,02H
INT21H
DECNN
JMPL2;循环输出N-I个空格
L1:
MOVBL,I
SHLBL,1
SUBBL,1;(IX2)-1
L14:
MOVDL,'*'
MOVAH,02H
INT21H
DECBL
CMPBL,1
JBL3
JMPL14
L3:
MOVAL,N
SUBAL,I
MOVNN,AL
L4:
CMPNN,1
JBL5
MOVDL,''
MOVAH,02H
INT21H
DECNN
JMPL4;循环输出N-I个空格
L5:
MOVDL,0AH
MOVAH,2
INT21H
MOVDL,0DH
MOVAH,2
INT21H;输出回车换行
INCI
MOVBL,I
CMPBL,N
JAL6
MOVBL,0
JMPL10
L6:
MOVAH,4CH
INT21H
CODEENDS
ENDSTART
运行结果:
5)设有五个字数据存放在以BUF为首地址的内存单元中,要求采用调用多个字数据相加的子程序方法编程,和的低位字放在RESULT单元,和的高位字放在RESULT+2单元,并将结果显示在屏幕上。
源代码:
STACKSEGMENTSTACK
DB1024DUP(0)
STACKENDS
DATASEGMENT
BUFDW0F101H,110DH,52H,100H,456H
COUNT=($-BUF)/2
RESULTDW4DUP(?
),'$'
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
WDADDPROC
PUSHDI
MOVAX,0
MOVDX,0
MOVDI,OFFSETBUF
NEXT2:
ADDAX,[DI]
JNCNEXT1
INCDX
NEXT1:
ADDDI,2
LOOPNEXT2
POPDI
RET
WDADDENDP
SHOWPROC
PUSHCX
PUSHDI
MOVCX,04H
MOVDI,OFFSETRESULT
MOVBX,AX
ADDDI,07H
BBB:
MOVAX,BX
ANDAX,000FH
CMPAL,0AH
JBQQQ
ADDAL,07H
QQQ:
ADDAL,30H
MOV[DI],AL
DECDI
PUSHCX
MOVCL,04
SHRBX,CL
POPCX
LOOPBBB
MOVCX,0004H
CCC:
MOVAX,DX
ANDAX,000FH
CMPAL,0AH
JBDDD
ADDAL,07H
DDD:
ADDAL,30H
MOV[DI],AL
DECDI
PUSHCX
MOVCL,04H
SHRDX,CL
POPCX
LOOPCCC
POPDI
POPCX
RET
SHOWENDP
BEGIN:
MOVAX,DATA
MOVDS,AX
MOVCX,COUNT
CALLWDADD
CALLSHOW
MOVDX,OFFSETRESULT
MOVAH,09H
INT21H
MOVAH,4CH
INT21H
CODEENDS
ENDBEGIN
运行结果:
实验三算术运算与代码转换程序设计
一、实验目的
1)掌握算术运算程序的设计方法。
2)掌握代码转换程序的设计方法。
3)进一步掌握各种程序结构。
4)熟练掌握和使用用DEBUG调试程序。
二、实验内容
1)编制两个多字节整数加法和减法程序,并将结果按十六进制形式显示在屏幕上。
源代码:
DATASEGMENT
TABLEDWL1,L2,L3,L4,L5
BUFDB32H,20H,12H
NUMDB04H
DATAENDS
STACK1SEGMENTPARASTACK
DW20HDUP(0)
STACK1ENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK1
START:
MOVAX,DATA
MOVDS,AX
MOVBL,BUF
MOVBH,BUF+1
MOVCL,BUF+2
CMPBL,BH
JAL1
CMPBH,CL
JAL2
JMPL3
L1:
CMPBL,CL
JAL4
JMPL3
L2:
MOVDL,BUF+1
ANDDL,0F0H
SARDL,1
SARDL,1
SARDL,1
SARDL,1
ADDDL,30H
MOVAH,02H
INT21H