汇编语言 中断程序代码

汇编语言 中断程序代码,第1张

还是找到了以前写的,拿分来

;

;purpose:ring and display a message every 10 seconds

;

model small

stack 100h

data

count dw 1

msg db 'The bell is ringing!',0dh,0ah,'$'

code

main proc far

start:

mov ax,@data

mov ds,ax

mov al,1ch

mov ah,35h ;get interrupt vector

int 21h

push es

push bx

push ds

mov dx,offset ring

mov ax,seg ring

mov ds,ax

mov al,1ch

mov ah,25h

int 21h

pop ds

in al,21h

and al,11111110b

out 21h,al

sti

mov di,2000

delay:

mov si,3000

delay1:

dec si

jnz delay

pop dx

pop ds

mov al,1ch

mov ah,25h

int 21h

mov ah,4ch

int 21h

main endp

;---------------------

;purpose:ring every 10 seconds when substituted for interrupt 1ch

ring proc near

push ds

push ax

push cx

push dx

mov ax,@data

mov ds,ax

sti

dec count

jnz exit

mov dx,offset msg

mov ah,09h

int 21h

mov dx,100

in al,61h

and al,0fch

sound:

xor al,02

out 61h,al

mov cx,1400h

wait1:

loop wait1

dec dx

jne sound

mov count ,182

exit:

cli

pop dx

pop cx

pop ax

pop ds

iret

ring endp

end start

/电子时钟源代码/

#include<graphicsh>

#include<stdioh>

#include<mathh>

#include<dosh>

#define PI 31415926 /定义常量/

#define UP 0x4800 /上移↑键:修改时间/

#define DOWN 0x5000 /下移↓键:修改时间/

#define ESC 0x11b /ESC键 : 退出系统/

#define TAB 0xf09 /TAB键 : 移动光标/

/函数声明/

int keyhandle(int,int); /键盘按键判断,并调用相关函数处理/

int timeupchange(int); /处理上移按键/

int timedownchange(int); /处理下移按键/

int digithour(double); /将double型的小时数转换成int型/

int digitmin(double); /将double型的分钟数转换成int型/

int digitsec(double); /将double型的秒钟数转换成int型/

void digitclock(int,int,int ); /在指定位置显示时钟或分钟或秒钟数/

void drawcursor(int); /绘制一个光标/

void clearcursor(int);/消除前一个光标/

void clockhandle(); /时钟处理/

double h,m,s; /全局变量:小时,分,秒/

double x,x1,x2,y,y1,y2; /全局变量:坐标值/

struct time t[1];/定义一个time结构类型的数组/

main()

{

int driver, mode=0,i,j;

driver=DETECT; /自动检测显示设备/

initgraph(&driver, &mode, "");/初始化图形系统/

setlinestyle(0,0,3); /设置当前画线宽度和类型:设置三点宽实线/

setbkcolor(0);/用调色板设置当前背景颜色/

setcolor(9); /设置当前画线颜色/

line(82,430,558,430);

line(70,62,70,418);

line(82,50,558,50);

line(570,62,570,418);

line(70,62,570,62);

line(76,56,297,56);

line(340,56,564,56); /画主体框架的边直线/

/arc(int x, int y, int stangle, int endangle, int radius)/

arc(82,62,90,180,12);

arc(558,62,0,90,12);

setlinestyle(0,0,3);

arc(82,418,180,279,12);

setlinestyle(0,0,3);

arc(558,418,270,360,12); /画主体框架的边角弧线/

setcolor(15);

outtextxy(300,53,"CLOCK"); /显示标题/

setcolor(7);

rectangle(342,72,560,360); /画一个矩形,作为时钟的框架/

setwritemode(0); /规定画线的方式。mode=0, 则表示画线时将所画位置的原来信息覆盖/

setcolor(15);

outtextxy(433,75,"CLOCK");/时钟的标题/

setcolor(7);

line(392,310,510,310);

line(392,330,510,330);

arc(392,320,90,270,10);

arc(510,320,270,90,10); /绘制电子动画时钟下的数字时钟的边框架/

/绘制数字时钟的时分秒的分隔符/

setcolor(5);

for(i=431;i<=470;i+=39)

for(j=317;j<=324;j+=7){

setlinestyle(0,0,3);

circle(i,j,1); /以(i, y)为圆心,1为半径画圆/

}

setcolor(15);

line(424,315,424,325); /在运行电子时钟前先画一个光标/

/绘制表示小时的圆点/

for(i=0,m=0,h=0;i<=11;i++,h++){

x=100sin((h60+m)/360PI)+451;

y=200-100cos((h60+m)/360PI);

setlinestyle(0,0,3);

circle(x,y,1);

}

/绘制表示分钟或秒钟的圆点/

for(i=0,m=0;i<=59;m++,i++){

x=100sin(m/30PI)+451;

y=200-100cos(m/30PI);

setlinestyle(0,0,1);

circle(x,y,1);

}

/在电子表的左边打印帮助提示信息/

setcolor(4);

outtextxy(184,125,"HELP");

setcolor(15);

outtextxy(182,125,"HELP");

setcolor(5);

outtextxy(140,185,"TAB : Cursor move");

outtextxy(140,225,"UP : Time ++");

outtextxy(140,265,"DOWN: Time --");

outtextxy(140,305,"ESC : Quit system!");

outtextxy(140,345,"Version : 20");

setcolor(12);

outtextxy(150,400,"Nothing is more important than time!");

clockhandle();/开始调用时钟处理程序/

closegraph(); /关闭图形系统/

return 0; /表示程序正常结束,向 *** 作系统返回一个0值/

}

void clockhandle()

{

int k=0,count;

setcolor(15);

gettime(t);/取得系统时间,保存在time结构类型的数组变量中/

h=t[0]ti_hour;

m=t[0]ti_min;

x=50sin((h60+m)/360PI)+451; /时针的x坐标值/

y=200-50cos((h60+m)/360PI); /时针的y坐标值/

line(451,200,x,y);/在电子表中绘制时针/

x1=80sin(m/30PI)+451; /分针的x坐标值/

y1=200-80cos(m/30PI); /分针的y坐标值/

line(451,200,x1,y1); /在电子表中绘制分针/

digitclock(408,318,digithour(h)); /在数字时钟中,显示当前的小时值/

digitclock(446,318,digitmin(m)); /在数字时钟中,显示当前的分钟值/

setwritemode(1);

/规定画线的方式,如果mode=1,则表示画线时用现在特性的线

与所画之处原有的线进行异或(XOR) *** 作,实际上画出的线是原有线与现在规定

的线进行异或后的结果。因此, 当线的特性不变, 进行两次画线 *** 作相当于没有

画线,即在当前位置处清除了原来的画线/

for(count=2;k!=ESC;){ /开始循环,直至用户按下ESC键结束循环/

setcolor(12);/淡红色/

sound(500);/以指定频率打开PC扬声器,这里频率为500Hz/

delay(700);/发一个频率为500Hz的音调,维持700毫秒/

sound(200);/以指定频率打开PC扬声器,这里频率为200Hz/

delay(300);

/以上两种不同频率的音调,可仿真钟表转动时的嘀哒声/

nosound(); /关闭PC扬声器/

s=t[0]ti_sec;

m=t[0]ti_min;

h=t[0]ti_hour;

x2=98sin(s/30PI)+451; /秒针的x坐标值/

y2=200-98cos(s/30PI); /秒针的y坐标值/

line(451,200,x2,y2);

/绘制秒针/

/利用此循环,延时一秒/

while(t[0]ti_sec==s&&t[0]ti_min==m&&t[0]ti_hour==h)

{ gettime(t);/取得系统时间/

if(bioskey(1)!=0){

k=bioskey(0);

count=keyhandle(k,count);

if(count==5) count=1;

}

}

setcolor(15);

digitclock(485,318,digitsec(s)+1);/数字时钟增加1秒/

setcolor(12); /淡红色/

x2=98sin(s/30PI)+451;

y2=200-98cos(s/30PI);

line(451,200,x2,y2);

/用原来的颜色在原来位置处再绘制秒针,以达到清除当前秒针的目的/

/分钟处理/

if(t[0]ti_min!=m){ /若分钟有变化/

/消除当前分针/

setcolor(15); /白色/

x1=80sin(m/30PI)+451;

y1=200-80cos(m/30PI);

line(451,200,x1,y1);

/绘制新的分针/

m=t[0]ti_min;

digitclock(446,318,digitmin(m)); /在数字时钟中显示新的分钟值/

x1=80sin(m/30PI)+451;

y1=200-80cos(m/30PI);

line(451,200,x1,y1);

}

/小时处理/

if((t[0]ti_hour60+t[0]ti_min)!=(h60+m)){ /若小时数有变化/

/消除当前时针/

setcolor(15); /白色/

x=50sin((h60+m)/360PI)+451;/50:时钟的长度(单位:像素),451:圆心的x坐标值/

y=200-50cos((h60+m)/360PI);

line(451,200,x,y);

/绘制新的时针/

h=t[0]ti_hour;

digitclock(408,318,digithour(h));

x=50sin((h60+m)/360PI)+451;

y=200-50cos((h60+m)/360PI);

line(451,200,x,y);

}

}

}

int keyhandle(int key,int count) /键盘控制 /

{ switch(key)

{case UP: timeupchange(count-1); /因为count的初始值为2,所以此处减1/

break;

case DOWN:timedownchange(count-1); /因为count的初始值为2,所以此处减1/

break;

case TAB:setcolor(15);

clearcursor(count); /清除原来的光标/

drawcursor(count); /显示一个新的光标/

count++;

break;

}

return count;

}

int timeupchange(int count) /处理光标上移的按键/

{

if(count==1){

t[0]ti_hour++;

if(t[0]ti_hour==24) t[0]ti_hour=0;

settime(t); /设置新的系统时间/

}

if(count==2){

t[0]ti_min++;

if(t[0]ti_min==60) t[0]ti_min=0;

settime(t); /设置新的系统时间/

}

if(count==3){

t[0]ti_sec++;

if(t[0]ti_sec==60) t[0]ti_sec=0;

settime(t); /设置新的系统时间/

}

}

int timedownchange(int count) /处理光标下移的按键/

{

if(count==1) {

t[0]ti_hour--;

if(t[0]ti_hour==0) t[0]ti_hour=23;

settime(t);/设置新的系统时间/

}

if(count==2) {

t[0]ti_min--;

if(t[0]ti_min==0) t[0]ti_min=59;

settime(t);/设置新的系统时间/

}

if(count==3) {

t[0]ti_sec--;

if(t[0]ti_sec==0) t[0]ti_sec=59;

settime(t);/设置新的系统时间/

}

}

int digithour(double h)/将double型的小时数转换成int型/

{int i;

for(i=0;i<=23;i++)

{if(h==i) return i;}

}

int digitmin(double m)/将double型的分钟数转换成int型/

{int i;

for(i=0;i<=59;i++)

{if(m==i) return i;}

}

int digitsec(double s) /将double型的秒钟数转换成int型/

{int i;

for(i=0;i<=59;i++)

{if(s==i) return i;}

}

void digitclock(int x,int y,int clock)/在指定位置显示数字时钟:时\分\秒/

{char buffer1[10];

setfillstyle(0,2);

bar(x,y,x+15,328);

if(clock==60) clock=0;

sprintf(buffer1,"%d",clock);

outtextxy(x,y,buffer1);

}

void drawcursor(int count) /根据count的值,画一个光标/

{switch(count)

{

case 1:line(424,315,424,325);break;

case 2:line(465,315,465,325);break;

case 3:line(505,315,505,325);break;

}

}

void clearcursor(int count) /根据count的值,清除前一个光标/

{switch(count)

{

case 2:line(424,315,424,325);break;

case 3:line(465,315,465,325);break;

case 1:line(505,315,505,325);break;

}

}

;TowTigerasm

;乐谱是:;1231 1231 345 345 565431 565431 25(低)1 25(低)1

;--------------------------------------------------------------------------------------------------

extrn delay:far

data segment

ftable dw 2 dup(262,294,330,262)

dw 2 dup(330,349,392,19)

dw 2 dup(392,440,392,349,330,262)

dw 2 dup(294,196,262,19),-1

ttable dw 8 dup(8)

dw 8 dup(8)

dw 2 dup(4,4,4,4,8,8)

dw 8 dup(8)

data ends

code segment

assume cs:code,ds:data

begin: mov ax,data

mov ds,ax

lea si,ftable

lea bp,ds:ttable

freq: mov di,[si]

cmp di,-1

je exit

mov bx,DS:[BP]

call sound

add si,2

add bp,2

jmp freq

exit: mov ah,4ch

int 21h

sound proc near

push ax

push bx

push cx

push dx

push di

mov al,0b6h

out 43h,al

mov dx,12h

mov ax,348ch

div di

out 42h,al

mov al,ah

out 42h,al

in al,61h

mov ah,al

or al,3

out 61h,al

call delay

mov al,ah

out 61h,al

pop di

pop dx

pop cx

pop bx

pop ax

ret

sound endp

code ends

end begin

;--------------------------------------------------------------------------------------------------

这中间还用到了一个延迟用的通用子程序: delay

在delayasm里实现:

;--------------------------------------------------------------------------------------------------

public delay

code segment

assume cs:code

delay proc far

push ax

ms250: mov cx,16666

us015: in al,61h

and al,10h

cmp al,ah

je us015

mov ah,al

loop us015

dec bl

jnz ms250

pop ax

ret

delay endp

code ends

end

以上就是关于汇编语言 中断程序代码全部的内容,包括:汇编语言 中断程序代码、求一个汇编语言课程设计的MASM32时钟的程序、汇编宏指令等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/9767278.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-01
下一篇 2023-05-01

发表评论

登录后才能评论

评论列表(0条)

保存