汇编实例masm专用.docx

上传人:b****7 文档编号:11305562 上传时间:2023-02-26 格式:DOCX 页数:18 大小:19.43KB
下载 相关 举报
汇编实例masm专用.docx_第1页
第1页 / 共18页
汇编实例masm专用.docx_第2页
第2页 / 共18页
汇编实例masm专用.docx_第3页
第3页 / 共18页
汇编实例masm专用.docx_第4页
第4页 / 共18页
汇编实例masm专用.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

汇编实例masm专用.docx

《汇编实例masm专用.docx》由会员分享,可在线阅读,更多相关《汇编实例masm专用.docx(18页珍藏版)》请在冰豆网上搜索。

汇编实例masm专用.docx

汇编实例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

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

当前位置:首页 > 高等教育 > 历史学

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

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