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