汇编实验报告.docx
《汇编实验报告.docx》由会员分享,可在线阅读,更多相关《汇编实验报告.docx(11页珍藏版)》请在冰豆网上搜索。
汇编实验报告
实验一汇编程序
一、实验目的
1.掌握DEBUG常用命令的使用方法
2.熟悉汇编源程序编辑、汇编、连接和调试过程
3.练习汇编源程序编写
二、实验内容及步骤
(一)学习DEBUG常用命令的使用方法
1.进入DEBUG;
2.用DEBUG的R命令查看、改变CPU寄存器的内容;
a)用R命令查看各寄存器的内容并纪录;
b)用R命令修改寄存器BX、SI、BP的值。
3.用DEBUG的D命令查看内存中的内容(以下内容分别使用不同的D命令);
a)用D命令查看从1000:
0开始的128个内存单元的内容并纪录;
b)用D命令查看从2000:
8开始的128个内存单元的内容并纪录;
c)用D命令查看从3000:
0开始的10个内存单元的内容并纪录;
4.用DEBUG的E命令改写内存中的内容;
用E命令将内存1000:
0—1000:
9单元中的内容改写为0、1、2、3、4、5、6、7、8、9,并进行验证。
5.用DEBUG的U命令将内存中的机器指令翻译成汇编指令;
用E命令从1000:
0单元开始写入如下机器码,然后用U命令将内存中的机器指令翻译成汇编指令,并分析实验结果各部分的含义。
机器码对应的汇编指令
b80100movax,0001
b90200movcx,0002
01c8addax,cx
6.用DEBUG的T命令执行机器指令;
用T命令单步执行上题程序段的每条指令并纪录结果。
7.用DEBUG的A命令以汇编指令的格式在内存中写入机器指令
用A命令将下面的程序段写入内存,用U命令翻译成机器指令,逐条执行,观察每条指令执行后,CPU中相关寄存器中内容的变化。
MOVAX,4E20H
ADDAX,1416H
MOVBX,2000H
ADDAX,BX
MOVBX,AX
ADDAX,BX
MOVAX,001AH
MOVBX,0026H
ADDAL,BL
ADDAH,BL
ADDBH,AL
MOVAH,0
ADDAL,BL
ADDAL,9CH
(二)掌握汇编程序编辑、汇编、连接及调试的方法
设首地址为BUFFER的内存缓冲区中有20H个字节数据,试将数据区中的正数(包括0)存放至起始地址为PLUS的缓冲区,负数存入起始地址为MINUS的缓冲区。
初始源程序如下,请用DEBUG软件调试该程序,找出其中的错误并加以修改。
;ex1.asm
Datasegment
Bufferdbf5h,46h,78h,4fh,0bch,0dah,0abh,02h//f5h应该改为0f5h
db12h,56h,0d5h,0ach,34h,89h,45h,0c3h
db00,14h,45h,58h,64h,0d4h,0c3h,0a5h
db0b3h,0ffh,0d9h,64h,0d3h,90h,80h,7fh
countequ$-buffer
plusdbcountdup(?
)
minusdbcountdup(?
)
dataends
stacksegmentstack‘stack’//应该有stack结束
db100dup(?
)
codesegmentpara‘code’
assumecs:
code,ss:
stack,ds:
data,es:
data
startprocfar//不能用start作为子程序名
pushds
xorax,ax
pushax
movax,data//应该放在主程序开始start后边
movds,ax
moves,ax
movsi,offsetbuffer
leadi,plus
leabx,minus
movcl,count
l1:
losdb//拼写错误,应该是lodsb
testal,80
jnzl2
stosb
l2:
xchgbx,di
stosb
xchgbx,di
again:
loopl1
ret//在ret前应该有pop操作
startendp//应该把start改为另外定义的子程序名
codeends
endstart
调试通过后的程序:
Datasegment
Bufferdb0f5h,46h,78h,4fh,0bch,0dah,0abh,02h
db12h,56h,0d5h,0ach,34h,89h,45h,0c3h
db00,14h,45h,58h,64h,0d4h,0c3h,0a5h
db0b3h,0ffh,0d9h,64h,0d3h,90h,80h,7fh
countequ$-buffer
plusdbcountdup(?
)
minusdbcountdup(?
)
dataends
stacksegmentstack'stack'
db100dup(?
)
stackends
codesegmentpara'code'
assumecs:
code,ss:
stack,ds:
data,es:
data
start:
movax,data
movds,ax
calldone
movax,4c00h
int21h
doneprocfar
pushds
xorax,ax
pushax
moves,ax
movsi,offsetbuffer
leadi,plus
leabx,minus
movcl,count
l1:
lodsb
testal,80
jnzl2
stosb
l2:
xchgbx,di
stosb
xchgbx,di
again:
loopl1
popax
popds
ret
doneendp
codeends
endstart
(三)编写汇编源程序
将两个多位十进制数相加(39174+65082),并在屏幕上显示加数、被加数以及和。
已知被加数和加数均以ASCII码形式存放在DATA1和DATA2为首的单元中(“低端方式存储”),结果送回DATA1中。
提示:
被加数和加数以ASCII码形式存放在内存中,在相加前必须转换为BCD码,用未组合BCD码最适宜。
未组合BCD码相加要用到AAA加法调整指令。
.modelsmall
.stack
.data
data1db'3','9','1','7','6'
data2db'6','5','0','8','2'
.code
start:
movax,@data
movds,ax
movdi,offsetdata1
movsi,offsetdata2
movcx,5
again:
;显示第一个加数
movdl,[di]
movah,2h
int21h
incdi
loopagain
movcx,5
calldecrf;调用回车换行子函数
again1:
;显示第二个加数
movdl,[si]
movah,2h
int21h
incsi
loopagain1
calldecrf
movcx,5
xorax,ax
movdi,offsetdata1+4;从低位开始
movsi,offsetdata2+4
again2:
sub[di],30h;转换为由十六进制表示的数字串形式
sub[si],30h
moval,[di]
addal,[si]
addal,ah
movah,0
aaa;aaa调整指令
addal,30h
mov[di],al
decdi
decsi
loopagain2
cmpah,1
jnzdone;若有进位则在前面显示1
movdl,'1'
movah,02h
int21h
done:
movdi,offsetdata1
movcx,5
again3:
movdl,[di]
movah,02h
int21h
incdi
loopagain3
movax,4c00h
int21h
decrfproc;回车换行子函数
pushax
pushdx
movah,2
movdl,0dh
int21h
movah,2
movdl,0ah
int21h
popdx
popax
ret
decrfendp
endstart
三、思考题
1.汇编程序经汇编和链接后产生的是哪一种可执行程序?
这种文件中IP的一般初始值是多少?
答:
用masm汇编程序对源程序进行汇编,形成目标文件,再用link链接程序对目标程序进行链接形成可执行文件。
IP的一般初始值为0000
1.调试过程中遇到什么问题?
如何解决?
答:
①对基本汇编指令不是很熟悉,通过查找资料解决;
②感觉算法不是很好,但是没有想出来更好的算法;
③在调试过程中有很多错误,通过debug调试出结果;