exp5.docx
- 文档编号:5268134
- 上传时间:2022-12-14
- 格式:DOCX
- 页数:23
- 大小:171.39KB
exp5.docx
《exp5.docx》由会员分享,可在线阅读,更多相关《exp5.docx(23页珍藏版)》请在冰豆网上搜索。
exp5
实验五80x86分支,循环,子程序,宏程序设计
姓名:
学号:
序号:
班级:
分数:
1.编写设计一个2,10,16进制的码制转换程序,要求:
①程序有友好的运行界面;
②输入任意类型进制的数据,转换为其余两种进制类型;
③要求程序有方便的输入输出功能;
④要求程序能够处理基本的错误信息;
⑤程序的基本结构采用子程序结构;
;CodebyIntSilence
.MODELHUGE
.STACK200h
.DATA
menuMsgdb'--=iTransferver0.0.1=--',0ah,0dh
db0ah,0dh
db'1.TransferBinarynumbertoDecimalnumber',0ah,0dh
db'2.TransferBinarynumbertoHexadecimalnumber',0ah,0dh
db'3.TransferDecimalnumbertoBinarynumber',0ah,0dh
db'4.TransferDecimalnumbertoHexadecimalnumber',0ah,0dh
db'5.TransferHexadecimalnumbertoBinarynumber',0ah,0dh
db'6.TransferHexadecimalnumbertoDecimalnumber',0ah,0dh
db'7.Exitmylittleprogram',0ah,0dh,0ah,0dh,0ah,0dh,'$'
backMsgdb0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,0ah,0dh,'Pressanykeytoreturnmainmenu...$'
wrongchoiceErrdb'Wronginput,numbers1~7tochoosefunction,ESCtoexit,tryagain!
!
!
',0ah,0dh,'$'
decoverflowErrdb0ah,0dh,0ah,0dh,'Thedecimalnumberuhavejustenteredistoolarge!
$'
funcTabledwBIN2DEC,BIN2HEX,DEC2BIN,DEC2HEX,HEX2BIN,HEX2DEC,exit
b2dMsgdb'Enterabinarynumber(shorterthan16bit),andIwilltelluadecimalnumber',0ah,0dh,0ah,0dh,'$'
b2hMsgdb'Enterabinarynumber(shorterthan16bit),andIwilltelluahexadecimalnumber',0ah,0dh,'$'
d2bMsgdb'Enteradecimalnumber(lessthan65535d),andIwilltelluabinarynumber',0ah,0dh,0ah,0dh,'$'
d2hMsgdb'Enteradecimalnumber(lessthan65536d),andIwilltelluahexadecimalnumber',0ah,0dh,'$'
h2bMsgdb'Enterahexadecimalnumber(lessthanFFFFH),andIwilltelluabinarynumber',0ah,0dh,0ah,0dh,'$'
h2dMsgdb'Enterahexadecimalnumber(lessthanFFFFH),andIwilltelluadecimalnumber',0ah,0dh,'$'
binnaryMsgdb'Thebinarynumberis:
$'
decimalMsgdb'Thedecimalnumberis:
$'
hexadecimalMsgdb'Thehexadecimalnumberis:
$'
binrMsgdb0ah,0dh,'Theresultofbinaryoneis:
$'
decrMsgdb0ah,0dh,'Theresultofdecimaloneis:
$'
hexrMsgdb0ah,0dh,'Theresultofhexadecimaloneis:
$'
bufferTmpdw1dup(0)
decModdw10d
.CODE
START:
movah,9
moval,''
movbh,0
movbl,1eh
movcx,80
int10h;标题来个彩色的,还带底纹哟
movah,2
movbh,0
movdh,2
movdl,0
int10h;移光标到菜单显示处
movah,9
moval,''
movbh,0
movbl,9
movcx,80*7
int10h;菜单也要彩色,底纹就不要了,主次分明嘛~
movah,2
movbh,0
movdh,9
movdl,0
int10h;移光标到菜单后面,用户有wronginput这里就会有输出
movah,9
moval,''
movbh,0
movbl,12
movcx,80*10
int10h;既然是WARNING就来个醒目的大红色吧
movah,2
movbh,0
movdh,0
movdl,0
int10h;颜色改完了再把光标移回去
movax,@data
movds,ax
leadx,menuMsg
movah,9
int21h;打印主菜单
choice:
movah,7
int21h
cmpal,1bh
jeexit;按下ESC则退出,其实按下数字7也是退出
cmpal,'1'
jcerror;输入acsii码比'1'小提示出错
cmpal,'7'
jaerror;比'7'大提示出错
movbx,0
movbl,al
subbl,'1';能执行到这里用户输入肯定是合法的,那么把ASCII码转换成机器码
addbx,bx;要查表的,地址是WORD,所以要乘以2
callWORDptrfuncTable[bx]
jmpSTART;执行完相应的功能后返回主菜单重新开始
error:
leadx,wrongchoiceErr
movah,9
int21h
jmpchoice;提示错误信息然后重新输入
exit:
movah,4ch
int21h;返回DOS
BIN2DEC:
;二进制转十进制,下同
movax,3
int10h;先清屏
callSETCOLOR;设置颜色
leadx,b2dMsg
movah,9
int21h;提示用户,现在程序的功能是输入二进制,转换成十进制
callBININPUT;以二进制的方式输入数据,存在bufferTmp中
callDECOUTPUT;将缓存中的数据以十进制的方式输出
callBACKTOMENU;输出完成后提示任意键返回主菜单
ret;返回
BIN2HEX:
movax,3
int10h
callSETCOLOR
leadx,b2hMsg
movah,9
int21h
callBININPUT
callHEXOUTPUT
callBACKTOMENU
ret
DEC2BIN:
movax,3
int10h
callSETCOLOR
leadx,d2bMsg
movah,9
int21h
callDECINPUT
callBINOUTPUT
callBACKTOMENU
ret
DEC2HEX:
movax,3
int10h
callSETCOLOR
leadx,d2hMsg
movah,9
int21h
callDECINPUT
callHEXOUTPUT
callBACKTOMENU
ret
HEX2BIN:
movax,3
int10h
callSETCOLOR
leadx,h2bMsg
movah,9
int21h
callHEXINPUT
callBINOUTPUT
callBACKTOMENU
ret
HEX2DEC:
movax,3
int10h
callSETCOLOR
leadx,h2dMsg
movah,9
int21h
callHEXINPUT
callDECOUTPUT
callBACKTOMENU
ret
BININPUT:
;以二进制方式输入
leadx,binnaryMsg
movah,9
int21h;提示用户输入二进制数据
movbx,0;存储用户数据,先清零
movcx,10h;二进制数最多只能有十六位
loopBin:
movah,7
int21h;不带回显的输入,先判断用户输入是否合法,否则不予以现实,下同
cmpal,0dh
jeexitBin;按下回车停止输入
cmpal,'0';输入比'0'小则忽略
jcloopBin
cmpal,'1';输入比'1'大也忽略
jaloopBin
movdl,al
movah,2
int21h;程序能够执行到这里说明输入合法,好,显示用户的输入,下同
subal,'0';ASCII码转机器能识别的数据
rcral,1;把刚才转好的数据移入CF
rclbx,1;再从CF移入bx
movbufferTmp,bx;好,储存当前的数据
looploopBin
exitBin:
ret
BINOUTPUT:
;以二进制方式输出缓存中数据
leadx,binrMsg
movah,9
int21h;提示后面的输出代表什么
movcx,10h
movbx,bufferTmp
binoutLoop:
rclbx,1;从最高位输出
jncprintZero;是0就输出0,反之输出1
movdl,'1'
movah,2
int21h
jmpjmpLoop
printZero:
movdl,'0'
movah,2
int21h
jmpLoop:
loopbinoutLoop
ret
DECINPUT:
;十进制输入
leadx,decimalMsg
movah,9
int21h;提示在程序要你干嘛
xorbx,bx
movcx,5
loopDec:
movah,7
int21h
cmpal,0dh
jeexitDec
cmpal,'0'
jcloopDec
cmpal,'9'
jaloopDec;只接受数字
movdl,al
movah,2
int21h
subal,30h
movah,0
pushax;转换成机器码并存起来,因为下面的乘法需要用AX
movax,bx
muldecMod;用户输入了新的数据那么bx原来的数据的权提高了,乘10
jcerrorDec;要是乘法超过16位就算溢出,当用户输入65536-99999之间的数字就会出现这种情况
movbx,ax;把乘法的结果移回缓存BX
popax
addbx,ax;加上用户新的输入
jcerrorDec;要是加了以后溢出同样报错
movbufferTmp,bx;用户可能输不满5位就enter退出了,那就把bx存起来把
looploopDec
exitDec:
ret
errorDec:
movah,9
moval,''
movbh,0
movbl,12
movcx,80*10
int10h
leadx,decoverflowErr
movah,9
int21h
callBACKTOMENU;提示65536-99999之间的溢出并要求重新输入
jmpSTART
DECOUTPUT:
;十进制输出
leadx,decrMsg
movah,9
int21h
movax,bufferTmp
xordx,dx
movcx,5
divDec:
divdecMod
pushdx;除10,保存余数
xordx,dx;每次做完除法要清空DX
loopdivDec;循环五次
movcx,5
printDec:
popdx
adddl,30h
movah,2
int21h;依次取出五次除法的余数,并输出
loopprintDec
ret
HEXINPUT:
;十六进制输入
leadx,hexadecimalMsg
movah,9
int21h
movcx,4
xorbx,bx
loopHex:
movah,7
int21h
cmpal,0dh
jeexitHex;输入回车则退出输入界面
cmpal,'0'
jbloopHex;比'0'小的不予理睬
cmpal,'f'
jaloopHex;比'f'大的不予理睬
cmpal,'a'
jaeprintLetterHex;大于等于'a'那就是小写字母,jump到字母输出
cmpal,'F'
jaloopHex;比'F'大,又比'a'小,不予理睬
cmpal,'A'
jaeprintLetterHex;'A'-'F'之间的是大写字母,jump到字母输出
cmpal,'9'
jaloopHex;'9'-'A'之间的不予理睬
movdl,al;上面都不跳,那肯定是数字
movah,2
int21h;确认输入合法回显
subal,'0';转机器码
jmploopHex:
shlbx,1
shlbx,1
shlbx,1
shlbx,1
addbl,al
movbufferTmp,bx;对转换好的机器码移位储存
looploopHex
exitHex:
ret
printLetterHex:
andal,11011111B;小写转大写
movdl,al
movah,2
int21h;输出大写字母
subal,'A'
addal,0ah;求得机器码
jmpjmploopHex
;唉~~跳来跳去的,16进制输入控制也可以用查表的方法做,但是查表前也要判断是字母还是数字
;如果是字母转换为大写后才能找表里面的序号,这样反而不如直接转换方便了
HEXOUTPUT:
;十六进制输出
leadx,hexrMsg
movah,9
int21h
jmpshowHex
tableHexdb'0123456789ABCDEF';输出建表比较方便
showHex:
movcx,bufferTmp
andch,11110000b
shrch,1
shrch,1
shrch,1
shrch,1
movbl,ch
movbh,0;取最高位
movdl,tableHex[bx];查表输出
movah,2
int21h
movcx,bufferTmp
andch,00001111b
movbl,ch
movdl,tableHex[bx];第二位输出
int21h
movcx,bufferTmp
andcl,11110000b
shrcl,1
shrcl,1
shrcl,1
shrcl,1
movbl,cl;取第三位
movdl,tableHex[bx];查表输出
int21h
movcx,bufferTmp
andcl,00001111b
movbl,cl
movdl,tableHex[bx];最后一位
int21h
ret
BACKTOMENU:
leadx,backMsg
movah,9
int21h;提示任意键返回主菜单
movah,7
int21h;接受输入
movax,3
int10h;清屏
ret
SETCOLOR:
movah,2
movbh,0
movdh,2
movdl,35
int10h;移光标到用户输入的地方,用高亮彩色显示
movah,9
moval,''
movbh,0
movbl,0ah
movcx,16
int10h;
movah,2
movbh,0
movdh,3
movdl,35
int10h;移光标到结果显示的地方,另一种高亮显示结果
movah,9
moval,''
movbh,0
movbl,0bh
movcx,16
int10h;
movah,2
movbh,0
movdh,0
movdl,0
int10h;移光标到(0,0)
ret
ENDSTART
2.采用宏结构编写程序,要求:
①程序有友好的运行界面;
②首先首先按下面的格式输出显示自己的信息
*****日期********时间****(格式要修居中)
*****name********birthday****(格式要修居中)
xxxxxxx—xx—xx(格式要修居中)
③从键盘输入1-7中的一个数据,根据输入显示输出对应的星期几的英文单词全称。
④要求程序有方便的输入输出功能;
⑤要求程序能够处理基本的错误信息;
要求:
提供算法,源程序(重点程序部分需要注释),程序执行效果的截图,最后对本次试验进行个人总结。
注释和个人总结要求手写,其他的可以打印。
;CodebyIntSilence
.modelsmall
.stack200h
.data
dateTodaydb'Thedateoftodayis:
$'
weeksTodaydb0ah,0dh,'Theweeksoftodayis:
$'
timeToadydb0ah,0dh,'Currenttimeofthiscomputeris:
$'
infodb0ah,0dh,0ah,0dh,0ah,0dh,'*************************Name********Birthday**********************************',0ah,0dh
db'IntSilence19920421',0ah,0dh,0ah,0dh
db'Letmeshowutheweekday~Onlynumbersbetween1and7isaccepted!
',0ah,0dh
db'Yourchoice:
$'
mondb'Monday$'
tuedb'Tuesday$'
weddb'Wednesday$'
thudb'Thursday$'
fridb'Friday$'
satdb'Saturday$'
sundb'Sunday$'
errMsgdb0ah,0dh,0ah,0dh,0ah,0dh,'Wronginput,1~7only!
Pressanykeytore-input...',0ah,0dh,'$'
tabledwmon,tue,wed,thu,fri,sat,sun
weekNowTabledwsun,mon,tue,wed,thu,fri,sat;我们一般从星期一开始计算,但机器返回的星期是从星期天开始的,所以这里有两个表
decModdw10d
isBytedb?
.CODE
SHOWWEEKDAYSMACRONUMBER
movbl,NUMBER
xorbh,bh
addbx,bx;要查表的,地址是WORD,所以要乘以2
movdx,table[bx]
movah,9
int21h
ENDM
;这个宏是从第一个程序里面copy过来的,因为byte和word除法用的寄存器不一样
;因此稍微改了下,统一用word除法,调用的时候判断下是否为byte,输出时jump下就行了
;囧做完后才发现调用这个宏的只有年份是WORD其余全是BYTE时间不够了要不然可以改一个daa调整进制的、、、
DECOUTPUTMACRObufferTmp,isByte;十进制输出
localdivDec,printDec,loopDec,normalOutDec
movax,bufferTmp
xordx,dx
movcx,4;循环四次
divDec:
divdecMod
pushdx;除10,保存余数
xordx,dx;每次做完除法要清空DX
loopdivDec
movcx,4
printDec:
popdx
cmpisByte,0
jenormalOutDec;先判断下如果是word就正常输出
cmpcx,3
jbnormalOutDec;已经是byte了,如果不是前两位,那么还是正常输出
cmpdx,0
jeloopDec;如果是byte,又是前两位,又是0,那就不输出
normalOutDec:
adddl,30h
movah,2
int21h;依次取出五次除法的余数,并输出
loopDec:
loopprintDec
ENDM
START:
movax,@data
movds,ax
movax,3
int10h;先清屏
movah,9;在当前光标位置显示字符,不改变光标位置
moval,'';显示空格,其实这样弄就是设置下当前光标位置的颜色,并不输出文字
movbh,0
movbl,11;bl表示颜色。
movcx
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- exp5
![提示](https://static.bdocx.com/images/bang_tan.gif)