汇编数值转换器大作业Word格式文档下载.docx
《汇编数值转换器大作业Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《汇编数值转换器大作业Word格式文档下载.docx(20页珍藏版)》请在冰豆网上搜索。
3子程序之间调用关系框图
我们的这个程序主要就是用到的子程序的调用和大量的宏定义,对于输入时的宏定义有charin,strin,numin,输出时的宏定义有charout,strout,numout,输出的时候用到的是栈push和pop,在压栈push时,用到了irp不定重复伪操作。
定义通用inax宏,确定转换之前的进制,例如inaxcx、cx=2是把转换之前的进制确定为2存到cx中
定义通用outax宏,确定转换之后的进制,例如outaxbx、bx=2是把转换之后的进制确定为2存到bx中
通用宏charin逐个输入转换之前进制字符
输入的具体框图如下:
输出的具体框图如下
程序运行源代码如下:
;
*************************************************************************************
datasegment
spacedb1000dup('
'
)
str1db10dup('
),9dup('
),'
Welcometoshuzhizhuanhuan!
!
'
52dup('
str12db240dup('
Thankyou!
412dup('
clear_screenMACRO;
清屏宏定义
movah,06h
moval,0
movbh,0f0h;
白底黑字
movch,0;
从0行0列到23行79列清屏
movcl,0
movdh,23
movdl,79
int10h
movdx,0;
光标在左上角
movah,2
int10h;
调用bios
ENDM
menudb10,13,'
*************************************************'
db10,13,'
*pleasechoiceaction:
*'
*a.binary2tooctal8*'
*b.binary2todecimal10*'
*c.binary2tohexadecimal16*'
*d.octal8tobinary2*'
*e.octal8todecimal10*'
*f.octal8tohexadecimal16*'
*g.decimal10tobinary2*'
*h.decimal10tooctal8*'
*i.decimal10tohexadecimal16*'
*j.hexadecimal16tobinary2*'
*k.hexadecimal16tooctal8*'
*l.hexadecimal16todecimal10*'
*m.exit*'
10,13,'
$'
**************************************************************
2进制转换为16进制和10进制和8进制
str2db10,13,'
pleaseinputthebinarystring:
10,13,'
str21db'
thehexadecimalstringis:
str22db'
thedecimalstringis:
str23db'
theoctalstringis:
16进制转换为2进制和8进制和10进制
str3db10,13,'
pleaseinputthehexadecimalstring:
str31db'
thebinarystringis:
str32db'
str33db'
10进制转换为2进制和8进制和16进制
str4db10,13,'
pleaseinputthedecimalstring:
str41db'
str42db'
str43db'
8进制转换为2进制和10进制和16进制
str5db10,13,'
pleaseinputtheoctalstring:
str51db'
str52db'
str53db'
str0db10,13,'
ERROR!
pleaseinputa~m:
13,10,'
在数据段定义字符,数字,字符串的输入输出的宏定义
*************************************************
charinmacro;
字符输入
movah,01h
int21h
endm
************************************************
numinmacro;
数字输入
charin;
调用charin宏定义
subal,48;
48d=30h,将字符转换为数字
****************************************************
strinmacrostringin;
字符串输入
leadx,stringin
movah,0ah
****************************************************
charoutmacrooutchar;
字符输出
irprec,<
ax,dx>
;
不定重复伪操作
pushrec
endm
;
pushax
pushdx
movdl,outchar
movah,02h
popdx
popax
***************************************************
numoutmacrooutnum;
数字输出
pushax
pushdx
movdl,outnum
adddl,48
**************************************************
stroutmacrostringout;
字符串输出
leadx,stringout
movah,9
dataends
stacksegmentstack
dw200dup(?
stackends
codesegment
assumecs:
code,ds:
data,es:
data,ss:
stack
********************************************************
endlmacro
irpx,<
ax,bx,cx,dx>
pushx
endm
pushbx
pushcx
movdl,0ah;
回车换行
movah,2
movdl,0dh
popcx
popbx
*******************************************************
outaxmacrobasenum
pushbx
pushcx
movbx,basenum
calloutaxp
outaxpproc
movdx,0
movcx,0
outaxp_circle:
cmpax,0
jeoutaxp_next
divbx
pushdx
inccx
jmpoutaxp_circle
outaxp_next:
cmpal,10
jbnout
addal,55;
55d=37h
charoutal
jmpcout
nout:
numoutal
cout:
loopoutaxp_next
ret
outaxpendp
inaxmacrobasenum
movcx,basenum
callinaxp
inaxpproc
movax,0
inaxp0:
inaxp1:
charin
cmpal,13;
判断输入的是不是回车
jeinaxe
cmpal,'
0'
jbinaxp1
9'
jainaxnext1
subal,48
jmpinaxnum
inaxnext1:
A'
jbinaxp1
F'
jainaxnext2
subal,55
jmpinaxnum
inaxnext2:
a'
z'
jainaxp1
subal,87
inaxnum:
movbh,0
movbl,al
cmpax,0
jeinaxadd
mulcx
inaxadd:
addax,bx
jmpinaxp0
inaxe:
popax
inaxpendp
start:
movax,data
movds,ax
moves,ax
leabp,space
movdx,0b00h
movcx,1000
movbx,0020h
movax,1300h
leabp,str1;
显示welcome
movdx,0600h
movcx,120
movbx,000eh
movax,1301h
display:
stroutmenu
charin
cmpal,'
jebin2_oct8
jlerr
b'
jebin2_dec10
c'
jebin2_hex16
d'
jeoct8_bin2
e'
jeoct8_dec10
f'
jeoct8_hex16
g'
jedec10_bin2
h'
jedec10_oct8
i'
jedec10_hex16
j'
jehex16_bin2
k'
jehex16_oct8
l'
jehex16_dec10
m'
jeexit
n'
jnlerr
clear_screen
jmpdisplay
err:
stroutstr0
jmpdisplay
*****************************************************
bin2_hex16:
二进制转换
stroutstr2
inax2
endl
stroutstr21
outax16
jmpdisplay
bin2_dec10:
inax2
stroutstr22
outax10
bin2_oct8:
stroutstr23
outax8
*************************************************
hex16_bin2:
十六进制转换
stroutstr3
inax16
stroutstr31
outax2
hex16_oct8:
stroutstr32
outax8
jmpdisplay
hex16_dec10:
stroutstr33
outax10
dec10_bin2:
十进制转换
stroutstr4
inax10
stroutstr41
outax2
dec10_oct8:
stroutstr42
jmpdisplay
dec10_hex16:
stroutstr43
outax16
***********************************************************
oct8_bin2:
八进制转换
inax8
oct8_dec10:
oct8_hex16:
**********************************************************
exit:
clear_screen;
调用宏定义,清屏
leabp,str12
movcx,520
movbx,004eh
movah,4ch
int21h
codeends
endstart
程序运行结果截图:
(包括正确输入和错误输入)
本次大作业,考虑到我们平时对数制转换的应用,并且各个进制转换起来使人头痛,我们组做的是一个数制转换器。
我们实现的就是各个数制之间的转换,一共有12个,在实现数制转换中,我们用到的有子程序的调用,还有就是广泛应用了宏定义,主要是想是下面的程序调用起来更方便直接。
在这次实验中我们也遇到了不少的问题,本来一开始我们打算做一个windows窗体,但是asm软件这部分不是免费的,所以我们只能做dos的界面了。
还有就是在程序中子程序之间的调用,输入用到了宏,由于是各个进制之间的转换,有数字也有字符,所以光输入就用到了charin,strin,numin等通用的宏定义,在宏定义中由于有push和pop的多次操作,我们就用irp不定重复伪操作来实现的。
在输出的时候用到的宏有charout,strout,numout。
后来有进行了改进,我们在一开始的界面加了文本颜色,由于能力有限,只有在第一次运行时有,在显示welcome是加到了bios中断,还有,在退出的时候,我们增加了一个thankyou的文本界面,也是用到了dios中断,int10h,在显示这个界面前,我们调用了一个清屏宏。
总结这次大作业,虽然费了很大的劲,经过我们几个的商讨,结果还算令我们满意,在这次实验中,我们组的成员都很积极,都有自己的收获。