实验报告Word文档格式.docx
《实验报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《实验报告Word文档格式.docx(22页珍藏版)》请在冰豆网上搜索。
movax,data
movds,ax
movah,0ah;
读取加数与被加数
movdx,offsetdata1
int21h
movah,2
movdl,0dh
movdl,0ah
movah,0ah
movdx,offsetdata2
movsi,offsetdata1
movax,[si+1]
andax,00ffh
movbx,ax
movbyteptr[bx+si+2],'
0'
;
将未用到的数字位置0
movdi,offsetdata2
movbx,[di+1]
andbx,00ffh
movbyteptr[bx+di+2],'
movcx,2
pushax
divcl
cmpal,0
jzre
movcx,ax
popax;
将低位放在存储器的低地址,高位放高地址
ch1:
pushsi
pushbx
movbx,cx
movdl,[bx+si+1]
subbx,cx
movdh,[bx+si+2]
mov[bx+si+2],dl
popbx
mov[bx+si+1],dh
popsi
loopch1
re:
movax,bx
jzren
popax
ch2:
pushdi;
movdl,[bx+di+1]
movdh,[bx+di+2]
mov[bx+di+2],dl
mov[bx+di+1],dh
loopch2
ren:
movcx,5;
进行5位数的加法
pushcx
Mlen:
movbx,1
movah,0
sahf
cal:
moval,[si+1+bx];
逐位进行加法运算
pushf
subal,30h
movah,[di+1+bx]
subah,30h
popf
adcal,ah
aaa
mov[si+1+bx],al
cmpah,0
jzcarry;
大于10则C标志位置1
stc
carry:
incbx
loopcal
popcx
jncex1
jcot1
ex1:
cmpbyteptr[bx+si+1],0;
没进位则除去高位的0
loopzex1
inccx
jmpot
ot1:
movdl,'
1'
;
最高位有进位则输出一个1
ot:
movbx,cx;
将得数按位输出
movdl,[si+1+bx]
ordl,30h
loopot
movah,4ch
codeends
endbegin
程序运行结果:
实验2:
—BCD码相乘:
实现BCD码的乘法,要求被乘数和乘数(0~99)以压缩BCD码形式存放,各占1个字节内存单元。
乘积存放在另外2个字节内存单元中。
data1db3;
被乘数
db?
db3dup(30h)
data2db3;
乘数
db3dup(30h)
stacksegmentstack
code,ds:
data,ss:
stack
movbx,dx
movcl,[bx+1];
CL中存放数的位数
cmpcl,1
jnzmul2;
如果为1位数则高位添0
moval,[bx+2]
movbyteptr[bx+2],30h
mov[bx+3],al
mul2:
movah,0ah
jnzdeal;
movbyteptr[bx+2],30h
mov[bx+3],al
deal:
movah,2;
回车换行处理
movcl,4
moval,[si+3]
movbl,[di+3]
subbl,30h
mulbl;
逐位相乘
aam;
处理为非压缩BCD码
shlal,cl
shrax,cl;
变为压缩BCD码
movdx,ax;
结果放在DX中
moval,[si+2]
mulbl
aam
shlal,cl
addal,dl;
与前一次运算结果相加并处理为压缩BCD码
daa
movdl,al
adcdh,ah
moval,dh
daa
movdh,al
movbl,[di+2]
addal,dl
shlax,cl
adddh,ah
movch,0;
CH=0则未开始输出数字
movcl,4
movax,dx;
开始逐位输出结果
andah,0f0h
shrah,cl
movdl,ah;
将每一位数放在DL
cmpdl,0;
若为0则不输出
jztwo
incch
two:
andah,0fh
movdl,ah
pushdx
adddl,ch
cmpdl,0
popdx
jzthree;
如果未开始输出且为0则不输出
incch
three:
andal,0f0h
shrdl,cl
jzfour;
four:
andal,0fh
int21h
endbegin
实验3:
—字符匹配程序:
从键盘上输入一个字符串,回车结束并回显。
用串操作指令设计程序,实现在输入的字符串存储区中寻找空格字符,退出时给出是否找到的信息,并给出具体位置。
data1db'
findit!
'
0dh,0ah,'
$'
发现
data2db'
nooooot!
没发现
inputdb30;
输入的字符串
db30dup(?
extrasegment
targetdb30dup(?
);
在附加段中的输入的字符串
extraends
data,es:
extra,ss:
movax,extra
moves,ax
movah,0ah
movdx,offsetinput
movbx,offsetinput
movsi,[bx+1]
andsi,00ffh
movbyteptr[bx+si+2],0dh
incsi
movbyteptr[bx+si+2],0ah
输入字符串,并加上换行回车
int21h;
屏幕上回车换行
movcx,si
movdi,0
loo1:
movdl,[bx+di+2]
incdi
looploo1;
输出字符串
movdi,offsettarget
movsi,offsetinput
addsi,2
movcx,[bx+1]
andcx,00ffh
addcx,3
repmovsb;
字符串转移至附加段
moval,20h
movbx,di
movsi,0;
辅助判断是否需要输出对应信息
loo3:
repnescasb;
找空格
jcxzloo2
cmpsi,0
jzfind
con:
pushdi
subdi,bx
movdx,di
calldealnum
movdl,20h
popdi
jmploo3
final:
movah,8;
程序结束
loo2:
cmpsi,0;
输出没找到
jnzfinal
movah,9
jmpfinal
find:
movdx,offsetdata1;
输出找到
jmpcon
dealnumproc;
处理输出数字的过程
anddx,00ffh
movax,dx
movbx,10
divbl
ret
dealnumendp
实验4:
—冒泡法排序:
在自BLOCK开始的存储区内有10个以压缩BCD码存放的无符号数(0~99),试用冒泡法排序,并将排序结果输出显示。
datasegment
blockdb12h,21h,10h,09h,56h,43h,78h,99h,00h,66h
db200dup(?
codesegment
movbx,offsetblock
movcx,10
movsi,0
loo4:
andax,0;
输出排序前内存中的数列
moval,[bx+si]
shral,cl
adddl,30h
movah,02h
looploo4
movbx,offsetblock
pushcx;
二重循环进行冒泡排序
deccx
movah,byteptr[bx+si+1]
cmpal,ah;
比较前后两个数
jnanchg;
大于则交换
mov[bx+si],ah
mov[bx+si+1],al
nchg:
cmpcx,0
jzstr
looploo2
str:
looploo1
输出排序后的数列
looploo3
movah,01h