汇编实例masm专用.docx
《汇编实例masm专用.docx》由会员分享,可在线阅读,更多相关《汇编实例masm专用.docx(18页珍藏版)》请在冰豆网上搜索。
![汇编实例masm专用.docx](https://file1.bdocx.com/fileroot1/2023-2/26/b5a2b149-4ae7-4f42-9dc2-469776a284a0/b5a2b149-4ae7-4f42-9dc2-469776a284a01.gif)
汇编实例masm专用
这是我们湖南农业大学09级计算机汇编语言的课程设计
我们所用的书籍是《钱晓捷的微机原理与接口技术第四版》
编译环境:
MASM可以在网址:
下载。
陈梦林刷屏显示时钟
;displaythecurrenttimeofsystemeverysecond
includeio16.inc
;.data
.code
start:
movax,@data
movds,ax
xoral,al
xordl,dl;为按秒输出做准备
again:
moval,0
out70h,al
inal,71h
cmpdl,al
movdl,al
jnemsg;以上为判断是否过了一秒,有则输出时间,没有则继续执行again
jemsg1
msg:
callclear
moval,4
out70h,al
inal,71h
calldisphb
moval,':
'
calldispc;通过cmosram获得小时
moval,2
out70h,al
inal,71h
calldisphb
moval,':
'
calldispc;通过cmosram获得分钟
moval,0
out70h,al
inal,71h
calldisphb
calldispcrlf;通过cmosram获得秒
callkbtest;判断是否输入空格子程序
cmpal,20h
jzjieshu;输入空格则退出
msg1:
jmpagain
jieshu:
exit0
kbtestproc
movah,1
int16h
jnzkbtest_1
movax,0ffh
stc
ret;没有内容自动返回
kbtest_1:
movah,7
int21h
movah,0
cmpal,0
jnzkbtest_2;输入的是ASCII码(AL)
movah,7
int21h;取扩展ASCII码(非字符码的功能键)
movah,1
clc
kbtest_2:
ret
kbtestendp
clearproc
pushax;入栈保护现场
pushbx
pushcx
pushdx
movax,00h;ah=06(滚动)al=00(全屏空白)
movbh,3eh;设置背景颜色
(2)和前景颜色(e)
subcx,cx
movdx,5f5fh
int10h
popdx;出栈恢复现场
popcx
popbx
popax
ret
clearendp
endstart
张运泉时钟代码
;操作说明书:
;输入1表示时间以12进制显示,输入其它以24进制显示
;在运行时可以输入字符进行时钟显示格式自由切换,输入空格程序运行结束
includeio16.inc
.data
ampmword1010h
pdatebyte'presentdate',13,10,0;显示
ptimebyte'presenttime',13,10,0;显示
banquanbyte'Studeng:
zhangyunquanTeacher:
lidonghui',0
design_timebyte'date:
2011-6-9',0
habyte09h
liebyte35
yearbyte00h
mouthbyte00h
daybyte00h
hourbyte00h
mintbyte00h
secndbyte00h
choicebyte00h
hellbyte'input1select12hour-system,intputanyotherkeysselect24-system',13,10,0
mdaybyte00h
.code
start:
movax,@data
movds,ax
callclear
movha,08h;保存光标移动到某行数的位置
movlie,5;光标移动到某列的位置
callcursor;移动光标并隐藏
moveax,offsethell
calldispmsg
movha,09h;保存光标移动到某行数的位置
movlie,39;光标移动到某列的位置
callcursor;移动光标并隐藏
callreadc;获取输入参数,来判断时钟的格式
movchoice,al;保存选择参数
calltime
exit0
;***********主程序结束*********************
;************光标移动子程序****************
cursorproc;;;确定光标所在位置
pusheax
pushecx
pushedx
movdh,ha;行数
movdl,lie;列数
movah,02h;int21的02h是设置光标
int10h;确定光标的位置,使其居在中间
movcx,2000h;隐藏光标
movah,01h;int21中的01h为设置光标形状
int10h;;;
popedx
popecx
popeax
ret
cursorendp
;***********光标移动子程序结束**************
;************清屏子程序*********************
clearproc;清屏子程序
pusheax
pushebx
pushecx
pushedx
movax,0600h;设置相关参数,清屏
movcx,0000h
;movdx,184fh
movdx,184fh
movbh,07h
int10h
popedx
popecx
popebx
popeax
ret
clearendp
;***********清屏子程序结束******************
;************获取日期子程序*****************
dateproc
pusheax
moval,9;cmosram9,8,7依次存放着年月日70h输出71h输入
out70h,al
inal,71h
movah,al;将al由BCD码转换为10进数
andah,11110000b
andal,00001111b
shrah,1
addal,2
addal,ah
movyear,al
moval,8;得到月份
out70h,al
inal,71h
movmouth,al
moval,7;得到日
out70h,al
inal,71h
movday,al
popeax
ret
dateendp
;*****************获取日期子程序结束******************************
;***获取时间子程序,且所有调用子程序操作基一上在这个子程序中实现****
timeproc
pusheax
pushebx
pushecx
pushedx
go:
movha,08h;保存光标移动到某行数的位置
movlie,5;光标移动到某列的位置
callcursor;移动光标并隐藏
moveax,offsethell
calldispmsg;显示
movha,0ah;保存光标移动到某行数的位置
movlie,35;光标移动到某列的位置
callcursor;移动光标并隐藏
moveax,offsetpdate
calldispmsg
movha,0ch
movlie,35
callcursor
moveax,offsetptime
calldispmsg
movha,15h
movlie,20
callcursor;调用子程序,将光标移到指定位置并隐藏
moveax,offsetbanquan
calldispmsg
movha,16h
movlie,35
callcursor
moveax,offsetdesign_time
calldispmsg
calldate;调用子程序得到日期
movah,02;获取系统时间
int1ah;系统时间调用
movhour,ch
;movhour,00h;;;;;调试小时用,给hour赋各种值(从00h到23h),发现了许多错误,并改过来了
movmint,cl
movsecnd,dh
callprint
a1:
movah,0bh;调用DOS功能0BH检测键盘是否有输入
int21h
cmpal,00h;检测是否有输入00h表无字符输入,ffh表有输入
jnea2;有则跳到a2
jmpgo;没有则回到go
a2:
movah,08h;有输入,将输入保存到al中
int21h
movchoice,al;将输入的参数赋值到选择参数中,用以进行时钟格式判断
cmpal,32;是空格,退出
jeex
callclear;如里有输入,不是空格,很有可能改变了时钟显示的格式,所以要清屏
jmpgo;循环
ex:
popedx
popecx
popebx
popeax
ret
timeendp
;************获取时间子程序结束*********
;***************打印子程序**************
printproc
pusheax
movha,0bh
movlie,35
callcursor;移光标
moval,20
cmpyear,00h;如果年份后两位是00,则前两位要增一,如从2099年--2100年
jnecont
incal
cont:
calldispuib
moval,year;显示年
calldispuib
moval,'-'
calldispc
moval,mouth;显示月
calldisphb
moval,'-'
calldispc
moval,day;显示日
calldisphb
movha,0dh
movlie,35
callcursor;移光标
cmpchoice,49;由choice参数来判断时钟显示的方式
jetwe
moval,hour;24进制
calldisphb;显示时
moval,':
'
calldispc
moval,mint;显示分
calldisphb
moval,':
'
calldispc
moval,secnd;显示秒
calldisphb
jmpext
twe:
moval,hour;12进制显示
cmpal,12h;时间大于12小时吗,大于的话跳到下午时间操作
japm
cmpal,00h;时间为早上凌晨(0时)吗,时凌晨的话,12进制显示为早上12点
jezeroam
jmpam
zeroam:
moval,12h;如里是24进制凌晨,刚改为12进制早上12点,不得跳到am,因为此时al为12H,如不从,则会当作时间为12h处理,则am会误赋值为pm
jmpam1
am:
moval,hour
am1:
calldisphb
cmphour,12h;因为12点是个特殊值,因为从24是进制换12进制不需减值,但要改成下午(pm)
jetwepm
movampm,'ma';am显示
jmpgo
pm:
moval,hour;时在19h时到22h时之间化12进制时减24(20h),其它减18(12h),注意以bcd码格式的
cmpal,19h;大于19h吗
jaok1;大于,跳转
jmpok2
ok1:
cmpal,21h;大于21h吗
jaok2;不大于,跳转
subal,24;满足在19H到22H之间,减24
jmpok3
ok2:
subal,18;不满足,减去18
ok3:
calldisphb
twepm:
movampm,'mp';pm显示
jmpgo
go:
moval,':
'
calldispc
moval,mint
calldisphb
moval,':
'
calldispc
moval,secnd
calldisphb
movax,ampm
calldispc
moval,ah
calldispc
ext:
popeax
ret
printendp
;************打印子程序结束*********
;*****************************
endstart
彭慧剑的九九乘法表
includeio32.inc
.data
equalbyte?
'*',?
'=',0;用来显示类似于1*2=3格式的字符串,
;其中的?
用来替代乘数和被乘数
entbyte0dh,0ah,0;用来显示回车
jibyte?
0;用来存储乘积
spacebyte'',0;用来显示空格
.code
start:
movcl,0;外循环变量
again:
;显示一个回车
pusheax
moveax,offsetent
calldispmsg
popeax
;外循环变量增加,内循环变量a1初始化为1
inccl
cmpcl,10
moval,1
jzover;程序跳到over段,结束
again1:
;计算乘积
pusheax
mulcl
movji,al
popeax
;显示单个乘数*被乘数=积形式的字符段
;其中寄存器ecx,eax要压入栈中保护起来
pushecx
pusheax
addal,30h
addcl,30h
movequal,al
movequal+2,cl
moveax,offsetequal
calldispmsg
WriteUDecByteji;利用宏指令WriteUDecByte以十进制显示十六进制的数
moveax,offsetspace
calldispmsg
popeax
popecx
;内循环变量加一,比较与外循环变量的大小
;大于则跳回外循环again中,小于则继续循环
incal
cmpal,cl
jgagain
jmpagain1
over:
exit0;结束字段
endstart
彭慧剑的进制转换
hhmacro
pusheax
moveax,offsetent
calldispmsg
popeax
endm
includeio32.inc
.data
entbyte0dh,0ah,0
stringbyte'1:
小写转大写',0ah,0dh,'2:
大写转小写',0ah,0dh,
'3:
二进制转十六进制',0ah,0dh,'4:
十六进制转二进制',
0ah,0dh,'5:
十六进制转十进制',0ah,0dh,'6:
按q退出',0
tmpword6dup(?
),0
.code
start:
cycle:
moveax,offsetstring
calldispmsg
hh
callreadc
cmpal,71h
jzover
cmpal,31h
jzz1
cmpal,32h
jzz2
cmpal,33h
jzz3
cmpal,34h
jzz4
cmpal,35h
jzz5
z1:
hh
callreadc
subal,20h
hh
calldispc
hh
jmpcycle
z2:
hh
callreadc
addal,20h
hh
calldispc
hh
jmpcycle
z3:
hh
callreadbb
hh
calldisphb
hh
jmpcycle
z4:
hh
callreadhb
hh
calldispbb
hh
jmpcycle
z5:
hh
callreadhb
hh
calldispuib
hh
jmpcycle
over:
exit0
endstart