汇编程序设计语言翻译机.docx
《汇编程序设计语言翻译机.docx》由会员分享,可在线阅读,更多相关《汇编程序设计语言翻译机.docx(20页珍藏版)》请在冰豆网上搜索。
汇编程序设计语言翻译机
汇编程序设计——语言翻译机
(一)实验内容
本次汇编程序设计题目选自2006年XX之星程序设计大赛初赛题目。
原题如下:
XX的工程师们是非常注重效率的,在长期的开发与测试过程中,他们逐渐创造了一套他们独特的缩率语。
他们在平时的交谈,会议,甚至在各中技术文档中都会大量运用。
为了让新员工可以更快地适应XX的文化,更好地阅读公司的技术文档,人力资源部决定开发一套专用的翻译系统,把相关文档中的缩率语和专有名词翻译成日常语言。
●输入数据:
输入数据包含三部分
1.第一行包含一个整数N(N<=10000),表示总共有多少个缩率语的词条。
2.紧接着有N行的输入,每行包含两个字符串,以空格隔开。
第一个字符串为缩率语(仅包含大写英文字符,长度不超过10),第二个字符串为日常语言(不包含空格,长度不超过255)。
3.从第N+2开始到输入结束为包含缩略语的相关文档。
(总长度不超过1000000个字符)
●输出数据:
将缩率语转换成日常语言,其他字符保留原样。
●输入样例:
6
PS(门户搜索部)
NLP(自然语言处理)
PM(产品市场部)
HR(人力资源部)
PMD(产品推广部)
MD(市场发展部)
XX的部门包括PS,PM,HR,PMD,MD等等,其中PS还包括NLP小组。
●输出样例:
XX的部门包括门户搜索部,产品市场部,人力资源部,产品推广部,市场发展部等等,其中门户搜索部还包括自然语言处理小组。
(二)算法流程图
本程序算法流程图如下:
main:
注:
input函数中使用0ah系统调用时输入完一个词条和文本后需要将缓冲区中字符串末尾回车符替换为$。
rank(排序):
strstr(查找):
strcpy(复制):
Strcat(粘贴):
(三)实验结果
(四)源程序
.modelsmall
.586
.data
numdb?
;替换词条个数
buf0db5;输入词条个数缓存
count0db?
word0db5dup(0)
tihuanstruc
buf1db20;结构体,储存数据
count1db?
word1db20dup('$')
buf2db40
count2db?
word2db40dup('$')
tihuanends
stringtihuan100dup(<>);结构体数组,存储词条
temptihuan<>
buf3db100;输入句子缓存
count3db?
xdb100dup('$')
ydb100dup('$')
notedb'此程序实现了字符串的查找替换。
例如',0ah,0dh,'输入(每行以回车键结束)',0ah,0dh,'2',0ah,0dh,
'NWPU',0ah,0dh,'TheNorthwesternPolytechnicalUniversity',0ah,0dh,'Beijing',0ah,0dh,'Xian',0ah,0dh,
'NWPUisoneofthebestuniversitiesinBeijing.',0ah,0dh,'则输出',0ah,0dh,
'TheNorthwesternPolytechnicalUniversityisoneofthebestuniversitiesinXian.',0ah,0dh,
'Nowpleaseenter:
$'
note1db'请输入词条个数:
',0ah,0dh,'$'
note2db'请输入被替换的词条:
',0ah,0dh,'$'
note3db'请输入替换词条:
',0ah,0dh,'$'
note4db'请输入文本:
',0ah,0dh,'$'
note5db'替换结果为:
',0ah,0dh,'$'
.code
.startup
movax,@data;数据段段基址
moves,ax
crmacro;宏:
回车
movdl,0dh
movah,2
int21h
endm
lfmacro;宏:
换行
movdl,0ah
movah,2
int21h
endm
movdx,offsetnote;输出提示
movah,9
int21h
cr
lf
callinput
callrank
moval,num
andax,00ffh
movcx,ax
movbx,offsetstring[0].word1
lop:
movax,offsetx
pushax
pushbx
callstrstr
cmpax,0
jznextword
movsi,ax
moval,[si+1]
;和下边第三行是为了解决缩略词条字数为1时的BUG!
mov[si],'$'
mov[si+1],al
moval,[bx-1]
andax,00ffh
addsi,ax
movax,offsety
pushax
pushsi
callstrcpy
movax,offsetx
pushax
movax,bx
addax,22
pushax
callstrcat
movax,offsetx
pushax
movax,offsety
pushax
callstrcat
jmplop
nextword:
addbx,64
looplop
movdx,offsetnote5;输出提示5
movah,9
int21h
movdx,offsetx
movah,9
int21h
.exit
inputprocnear;输入函数
movdx,offsetnote1;输出提示1
movah,9
int21h
movdx,offsetbuf0;输入词条个数0~99
movah,0ah
int21h
movbl,1;ASCII值转换为数值
movbh,0
moval,count0
andax,00ffh
movcx,ax
lop0:
movsi,cx
subsi,1
moval,word0[si]
subal,30h
mulbl
addbh,al
moval,bl
movah,10
mulah
movbl,al
looplop0
movnum,bh
lf
moval,num;输入替换词条
andax,00ffh
movcx,ax;num值送计数器
movdi,0ffffh
leabx,string[0]
lop1:
movdx,offsetnote2;输出提示2
movah,9
int21h
movdx,bx
movah,0ah
int21h
lf
movsi,bx
moval,[si+1]
andax,00ffh
addsi,2
addsi,ax
mov[si],'$'
movdx,offsetnote3;输出提示3
movah,9
int21h
addbx,22
movdx,bx
movah,0ah
int21h
lf
movsi,bx
moval,[si+1]
andax,00ffh
addsi,2
addsi,ax
mov[si],'$'
addbx,42
looplop1
movdx,offsetnote4;输出提示4
movah,9
int21h
movdx,offsetbuf3;输入文本
movah,0ah
int21h
lf
movsi,offsetbuf3
moval,[si+1]
andax,00ffh
addsi,2
addsi,ax
mov[si],'$'
ret
inputendp;输入完毕
rankprocnear;排序函数
leabx,string[0]
movdl,num
anddx,00ffh
decdx
cmpdx,0
jznone
movsi,0ffffh
lop3:
incsi
movdi,si;外循环
movbp,bx
lop4:
incdi;内循环
addbp,64
moval,[bx].count1
movah,[bp].count1
cmpal,ah
jaenext
pushsi;string[si]与string[di]交换
pushdi
movcx,64
movsi,bx;temp=string[si]
leadi,temp
cld
repmovsb
movcx,64
movsi,bp;string[si]=string[di]
movdi,bx
repmovsb
movcx,64
leasi,temp;string[di]=temp
movdi,bp
repmovsb
popdi
popsi
next:
cmpdi,dx
jnzlop4
addbx,64
movax,dx
decax
cmpsi,ax
jnzlop3
none:
ret
rankendp
strstrprocnear
;查找替换词在句子中第一次出现的位置,若找到把其偏移地址AX,否则把0送AX。
堆栈传递入口参数
pushbp
pushcx
movbp,sp
movsi,[bp+6]
movdi,[bp+8]
lop5:
cmp[di],'$'
jzno;不存在
pushdi
pushsi
moval,[si-1]
andax,00ffh
movcx,ax
cld
repecmpsb
jzfound
popsi
popdi
incdi
jmplop5
found:
popsi;找到
popdi
movax,di
jmpexit0
no:
movax,0
exit0:
popcx
popbp
ret4
strstrendp
strcpyprocnear;字符串复制函数
pushbp
movbp,sp
movsi,[bp+4]
movdi,[bp+6]
nex:
moval,[si]
cmpal,'$'
jzexit1
moval,[si]
mov[di],al
incsi
incdi
jmpnex
exit1:
mov[di],'$'
;末尾加'$'!
!
!
否则多次用y后会出错。
如:
第一次将asd复制进y中,则y为asd$,若第二次将m复制进y,若末尾不加$,
popbp
;则y为msd$,导致合并xy时将sd也合并了进去
ret4
strcpyendp
strcatprocnear;字符串合并
pushbp
movbp,sp
movsi,[bp+4]
movdi,[bp+6]
lop6:
moval,[di]
cmpal,'$'
jzmove
incdi
jmplop6
move:
moval,[si]
mov[di],al
cmpal,'$'
jzexit2
incsi
incdi
jmpmove
exit2:
popbp
ret4
strcatendp
end
(五)实验总结
虽然本次实验要求简单明了,但我们在实际编程,尤其是运用汇编语言编写程序的过程中,还是遇到了一些困难,例如输出函数中未将缓冲中的回车符替换为$;strcpy函数中未在y字符串后加上$等。
我组成员查阅书本及相关资料,查找汇编指令的用法、BIOS中断调用、系统功能调用、磁盘数据的查询、存取等相关知识。
将困难逐一解决,最终成功运行程序,并得出了正确结果。
通过这次实验,我们对汇编语言的编程特点也有了更加深入的认识,自身的编程能力和逻辑思考能力也有了很大提升。