汇编程序设计语言翻译机.docx

上传人:b****4 文档编号:27493522 上传时间:2023-07-02 格式:DOCX 页数:20 大小:221.04KB
下载 相关 举报
汇编程序设计语言翻译机.docx_第1页
第1页 / 共20页
汇编程序设计语言翻译机.docx_第2页
第2页 / 共20页
汇编程序设计语言翻译机.docx_第3页
第3页 / 共20页
汇编程序设计语言翻译机.docx_第4页
第4页 / 共20页
汇编程序设计语言翻译机.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

汇编程序设计语言翻译机.docx

《汇编程序设计语言翻译机.docx》由会员分享,可在线阅读,更多相关《汇编程序设计语言翻译机.docx(20页珍藏版)》请在冰豆网上搜索。

汇编程序设计语言翻译机.docx

汇编程序设计语言翻译机

汇编程序设计——语言翻译机

(一)实验内容

本次汇编程序设计题目选自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中断调用、系统功能调用、磁盘数据的查询、存取等相关知识。

将困难逐一解决,最终成功运行程序,并得出了正确结果。

通过这次实验,我们对汇编语言的编程特点也有了更加深入的认识,自身的编程能力和逻辑思考能力也有了很大提升。

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > PPT模板 > 图表模板

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1