合工大汇编语言程序设计实验报告.docx
《合工大汇编语言程序设计实验报告.docx》由会员分享,可在线阅读,更多相关《合工大汇编语言程序设计实验报告.docx(27页珍藏版)》请在冰豆网上搜索。
合工大汇编语言程序设计实验报告
工业大学
计算机与信息学院
实验报告
课程:
汇编语言程序设计
专业班级:
****************
学号:
**********
姓名:
*****
实验一···········································3
实验二············································7
实验三···········································12
实验四···········································22
实验一Debug程序的使用
一.实验目的
1、熟悉DEBUG程序中的命令,学会在DEBUG下调试运行汇编语言源程序。
2、掌握8086/8088的寻址方式及多字节数据的处理方法。
二.实验容
1、利用DEBUG程序中的“E”命令,将两个多字节数“003F1AE7H”和“006BE5C4H”分别送入起始地址为DS:
0200H和DS:
0204H两个单元中。
2、分别用直接寻址方式和寄存器间接寻址方式编写程序段,实现将DS:
0200H单元和DS:
0204H单元中的数据相加,并将运算结果存放在DS:
0208H单元中。
要求:
本次实验的容均在DEBUG下完成,实现数据的装入、修改、显示;汇编语言程序段的编辑、汇编和反汇编;程序的运行和结果检查。
三.实验过程和程序
实验容一:
eds:
0200E71A3F00
eds:
0204C4E56B00
实验容二:
(1)直接寻址方式
MOVAX,[0200]
MOVBX,[0202]
ADDAX,[0204]
ADCBX,[0206]
MOV[0208],AX
MOV[020A],BX
(2)寄存器间接寻址方式
MOVSI,0200H
MOVDI,0204H
MOVBX,0208H
MOVAX,[SI]
MOVDX,[SI+2]
ADDAX,[DI]
ADCDX,[DI+2]
MOV[BX],AX
MOV[BX+2],DX
四.实验结果(包括必要的截图)
实验容一:
输入数据:
显示数据:
实验容二:
(1)直接寻址方式
程序段编辑:
反汇编:
运行:
结果在DS:
0208单元中为00AB00ABH
(2)寄存器间接寻址方式
程序段编辑:
反汇编:
运行:
结果高字存放在dx中,低字存放在ax中(结果为00AB00ABh)
五.实验体会
通过本实验,实践debug程序中的命令,并在debug下调试运行汇编语言源程序。
在实践过程中,解决如何把数据录入存储单元、debug命令如何使用等问题后,知道存数据例如1234进存储单元时要3412存,还有掌握了寄存器的寻址方式。
实验二汇编语言程序设计(顺序、循环)
一.实验目的
1、掌握顺序和循环程序结构和设计方法;
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
二.实验容
1、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。
试编写汇编语言程序完成以下功能:
①计算表达式值(V–(X*Y+Z-720))/X;
②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。
2、求一个班50名学生成绩的平均值(附加题:
最大值和最小值,并将结果显示出来)
3、从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串(附加题:
查找中间是否有‘asm’子串。
如果有,输出‘Yes’;否则,输出‘No’)。
三.实验过程和程序
(注:
附加题没有做)
实验容一:
X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。
试编写汇编语言程序完成以下功能:
①计算表达式值(V–(X*Y+Z-720))/X;②将上述表达式运算结果整数放在SUM1单元,余数放在SUM2单元。
Datasegment
xdw?
ydw?
zdw?
vdw?
sum1dw?
sum2dw?
Dataends
Codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movax,x
imuly
movcx,ax
movbx,dx
movax,z
cwd
addcx,ax
adcbx,dx
subcx,720
sbbbx,0
movax,v
cwd
subax,cx
sbbdx,bx
idivx
movsum1,ax
movsum2,dx
movah,4ch
int21h
Codeends
endstart
实验容二:
求一个班50名学生成绩的平均值(为了方便,只设置了5个学生数据)
datasegment
gradedw90,80,80,70,60;平均数76
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
xorax,ax
movcx,5
movbx,offsetgrade
again:
addax,[bx]
addbx,2
loopagain
movcx,5
cwd
idivcx
movah,4ch
int21h
codeends
endstart
实验容三:
从键盘读入一个字符串,以Enter结束,字符串不超过50个字符,并打印该字符串
datasegment
bufferdb50
db?
db50dup('$')
crdb0ah,0dh,"$"
dataends
codessegment
assumecs:
codes,ds:
data
start:
movax,data
movds,ax
input:
movah,10
leadx,buffer
int21h
leadx,cr
movah,9
int21h
output:
leadx,buffer+2
movah,9
int21h
movah,4ch
int21h
codesends
endstart
四.实验结果(包括必要的截图)
实验容一:
设x=156,y=10,z=220,v=2000,则sum1=0006h,sum2=0004h
在ax中看sum1,在dx中看sum2
实验容二:
预先设置的数据求得平均数为76,在ax中查看,即ax=004Ch
实验容三:
五.实验体会
通过本实验,将课本上学到的算术运算类指令、变量定义伪指令、存储单元、DOS0AH号功能(字符串输入)和DOS09H功能(字符串输出)等在实验中实现。
在实现过程中,解决遇到的问题(符号扩展、定义的数组存储空间地址、字符串如何输入输出等)后,对上述知识有了更深的了解,并掌握实现它。
实验三汇编语言子程序设计(分支、子程序)
一.实验目的
1、掌握分支和子程序结构和设计方法;
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程。
3、通过汇编语言了解高级语言的参数传递等知识。
二.实验容
1、BL中的只有一位为1。
编写程序测试,并输出提示信息“TheXBitis1”,要求:
地址表和转移表。
2.编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数存数)。
要求通过堆栈(寄存器、存)传送所有参数。
3.实践CAsm的转换过程。
三.实验过程和程序
实验容一:
BL中的只有一位为1。
编写程序测试,并输出提示信息“TheXBitis1”
(1)转移表
;转移表,bl左到右1-8位
DATASSEGMENT
str1db'the1bitis1',0dh,0ah,'$'
str2db'the2bitis1',0dh,0ah,'$'
str3db'the3bitis1',0dh,0ah,'$'
str4db'the4bitis1',0dh,0ah,'$'
str5db'the5bitis1',0dh,0ah,'$'
str6db'the6bitis1',0dh,0ah,'$'
str7db'the7bitis1',0dh,0ah,'$'
str8db'the8bitis1',0dh,0ah,'$'
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
movbl,00010000b
movcx,8
movsi,0
again:
shlbl,1
jcnext
addsi,3
loopagain
next:
addsi,offsetjmptable
jmpsi
jmptable:
jmpnearptrl1
jmpnearptrl2
jmpnearptrl3
jmpnearptrl4
jmpnearptrl5
jmpnearptrl6
jmpnearptrl7
jmpnearptrl8
l1:
leadx,str1
jmpoutput
l2:
leadx,str2
jmpoutput
l3:
leadx,str3
jmpoutput
l4:
leadx,str4
jmpoutput
l5:
leadx,str5
jmpoutput
l6:
leadx,str6
jmpoutput
l7:
leadx,str7
jmpoutput
l8:
leadx,str8
output:
movah,9
int21h
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
(2)地址表
;地址表,bl左到右依次是第1-8位
DATASSEGMENT
str1db'the1bitis1',0dh,0ah,'$'
str2db'the2bitis1',0dh,0ah,'$'
str3db'the3bitis1',0dh,0ah,'$'
str4db'the4bitis1',0dh,0ah,'$'
str5db'the5bitis1',0dh,0ah,'$'
str6db'the6bitis1',0dh,0ah,'$'
str7db'the7bitis1',0dh,0ah,'$'
str8db'the8bitis1',0dh,0ah,'$'
addrtabledwshow1,show2,show3,show4,show5,show6,show7,show8
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
movbl,00001000b
movcx,8
movsi,0
again:
shlbl,1
jcnext
addsi,2
loopagain
next:
jmpaddrtable[si]
show1:
leadx,str1
jmpoutput
show2:
leadx,str2
jmpoutput
show3:
leadx,str3
jmpoutput
show4:
leadx,str4
jmpoutput
show5:
leadx,str5
jmpoutput
show6:
leadx,str6
jmpoutput
show7:
leadx,str7
jmpoutput
show8:
leadx,str8
jmpoutput
output:
movah,9
int21h
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
实验容二:
编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数存数)
(1)堆栈传递参数
;z=x*y+x-y,x、y、z为有符号数,堆栈传递
DATASSEGMENT
xdw5
ydw2
zdw?
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
subsp,2
pushy
pushx
callcal
popz
movbx,z
MOVAH,4CH
INT21H
calproc
pushbp
movbp,sp
pushax
pushbx
movax,[bp+4]
movbx,[bp+6]
imulbx
addax,[bp+4]
adcdx,0
subax,[bp+6]
sbbdx,0
mov[bp+8],ax
popbx
popax
popbp
ret4
calendp
CODESENDS
ENDSTART
(2)寄存器传递参数
;z=x*y+x-y,x、y、z为有符号数,寄存器传递
DATASSEGMENT
xdw5
ydw2
zdw?
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
movax,x
movbx,y
callcal
movz,ax
MOVAH,4CH
INT21H
calproc
movcx,ax
imulbx
addax,cx
adcdx,0
subax,bx
sbbdx,0
ret
calendp
CODESENDS
ENDSTART
(3)存传递参数
;z=x*y+x-y,x、y、z为有符号数,存传递
DATASSEGMENT
xdw5
ydw2
zdw?
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
callcal
MOVAH,4CH
INT21H
calproc
movax,x
imuly
addax,x
adcdx,0
subax,y
sbbdx,0
movz,ax
ret
calendp
CODESENDS
ENDSTART
实验容三:
实践C—>ASM的转换过程
_TEXTSEGMENT
_c$=-32;size=2
_b$=-20;size=2
_a$=-8;size=2
_mainPROC;COMDAT
;4:
voidmain(){
pushebp
movebp,esp
subesp,228;000000e4H
pushebx
pushesi
pushedi
leaedi,DWORDPTR[ebp-228]
movecx,57;00000039H
moveax,-858993460;ccccccccH
repstosd
;5:
;6:
shorta,b,c;
;7:
a=1;
moveax,1
movWORDPTR_a$[ebp],ax
;8:
b=a+1;
movsxeax,WORDPTR_a$[ebp]
addeax,1
movWORDPTR_b$[ebp],ax
;9:
c=a+b;
movsxeax,WORDPTR_a$[ebp]
movsxecx,WORDPTR_b$[ebp]
addeax,ecx
movWORDPTR_c$[ebp],ax
;10:
;11:
;12:
}
xoreax,eax
popedi
popesi
popebx
movesp,ebp
popebp
ret0
_mainENDP
_TEXTENDS
四.实验结果(包括必要的截图)
实验容一:
(1)转移表:
设bl=00010000b
(2)地址表:
设bl=00001000b
实验容二:
设x=5,y=2,则z=13(000D),结果在ax
(1)堆栈传递参数(结果在bx中查看)
(2)寄存器传递参数(结果在ax中查看)
(3)存传递参数(结果在ax中查看)
五、实验体会
通过本实验,让我更加深入了解地址表和转移表、子程序和从C输出汇编文件等知识,通过实现地址表与转移表加深了对汇编寻址方式的了解;实现子程序,掌握主程序如何调用子程序,及子程序与主程序之间的参数传递方式;用VS实现C->ASM后,对C或C++有了新的认识。
实验四汇编语言高级编程专题
一.实验目的
1、汇编语言宏程序设计;
2、掌握中断服务子程序的编写。
3、汇编语言与高级语言的混编。
二.实验容
1、编写一个宏,求三个数的最小数,原型为:
MIN3x,y,z,min
2、挂接1CH中断,正计时60秒后退出。
要求屏幕显示0-59的秒数。
3、VC++中编写联汇编,将字节数组的每个元素高低四位互换。
chardbyte[]={0x34,0x45,0x56,0x67,0xaf};
三.实验过程和程序
1.编写一个宏,求三个数的最小数,原型为:
MIN3x,y,z,min
min3macrox,y,z,min
movax,x
cmpax,y
jbenext
movax,y
cmpax,z
jbedone
next:
cmpax,z
jbedone
done:
movmin,ax
endm
DATASSEGMENT
xdw2
ydw4
zdw3
mindw?
DATASENDS
CODESSEGMENT
ASSUMECS:
CODES,DS:
DATAS
START:
MOVAX,DATAS
MOVDS,AX
min3x,y,z,min
MOVAH,4CH
INT21H
CODESENDS
ENDSTART
2、挂接1CH中断,正计时60秒后退出。
要求屏幕显示0-59的秒数。
INTNOEQU1CH
DATASEGMENT
OLDISRDW?
?
TIMERDB100
COUNTERDW0
ISDONEDB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVAX,0
MOVES,AX
xorcx,cx
;PROTECT
MOVAX,ES:
[INTNO*4]
MOVOLDISR[0],AX
MOVAX,ES:
[INTNO*4+2]
MOVOLDISR[2],AX
;SETNEWISR
MOVWORDPTRES:
[INTNO*4],OFFSETISR
MOVWORDPTRES:
[INTNO*4+2],SEGISR
;WAITHERE
WAITHERE:
CMPISDONE,1
JNZWAITHERE
EXIT:
;RESTORE
MOVAX,OLDISR[0]
MOVES:
[INTNO*4],AX
MOVAX,OLDISR[2]
MOVES:
[INTNO*4+2],AX
MOVAX,4C00H
INT21H
ISRPROCFAR
PUSHDX
PUSHAX
MOVAX,DATA
MOVDS,AX
STI;便于中断嵌套
INCTIMER
;--------判断是否输入a-----------
movah,0bh
int21h
oral,al
jznext
MOVAH,8;不显示输入的字符
INT21H
CMPAL,'a'
JNEnext
MOVAH,2;换行
MOVDL,10
INT21H
;MOVCOUNTER,0;从起一行计时时从0开始计时,注释掉则从起一行继续旧时间计时
next:
CMPTIMER,1000/55
JBDONE
MOVTIMER,0
MOVAH,2
MOVDL,13
INT21H
;-------printtime---------
MOVAX,COUNTER
MOVDL,10
DIVDL
MOVDH,AH
MOVDL,AL
MOVAH,2
ADDDL,30H
INT21H
movah,2
movdl,dh
ADDDL,30H
INT21H
incCOUNTER
cmpCOUNTER,60
JNEDONE
MOVISDONE,1
DONE:
PUSHF
CALLDWORDPTROLDISR
CLI
POPAX
POPDX
IRET;中断返回
ISRENDP
CODEENDS
ENDSTART
3、VC++中编写联汇编,将字节数组的每个元素高低四位互换。
chardbyte[]={0x34,0x45,0x56,0x67,0xaf};
#include
unsignedcharchange(unsignedcharx)
{
unsignedchara