汇编语言 中断程序代码

汇编语言 中断程序代码,第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

mov di,2000

delay:

mov si,3000

delay1:

dec si

jnz delay

这段就是main process

改成你要的判断

还有也不要用21h了,换个保留的中断号就行了

比如说按键接在p32,用外部中断0实现键按一次进入外部中断程序并保持,再按一下中断返回

ORG 0000H

LJMP MAIN

ORG 000BH ;外部中断0的入口地址

LJMP IN0

ORG 0030H ;主程序的开始

MAIN:MOV SP,#60H

SETB EA ;开中断总允许

SETB EX0 ;开外部中断0允许

SETB IT0 ;外部中断0触发方式

SJMP $ ;原地踏步,可以用你自己的具体程序替代

IN0:JB P32,$ ;判断按键(p32)是否按下

JNB P32,$ ;判断按键(p32)是否释放

RETI ;中断返回断点处

END

int_0:

push psw

push acc

call loop

mov a,#00h ;

mov p1,a ;增加这两行,不就恢复初始状态了吗?

pop acc

pop psw

reti

你的意思是不是怎么用C语言实现汇编中的中断?

汇编中的中断是通过在中断向量表中对应位置的一条跳转指令跳到中断程序来实现中断的;而C语言也是差不多,只不过C语言的中断函数要用一个特殊的关键字去标明它,比如“#pragma

interrupt_handler

int_function()",当然,每一种编译器可能都不一样;这是中断函数与普通函数的区别。当然编译器碰到一个有这样关键字的函数时就知道它是中断函数,就会把这个函数的入口地址放到中断向量表中对应的位置去。当中断来的时候,这样就能跳到中断里面执行中断程序了。

ORG 00H ;开始地址

JMP MAIN ;跳转到主程序

ORG 03H ;外部中断0地址

JMP EXT1 ;跳转

ORG 13H ;外部中断1地址

JMP EXT2 ;跳转

MAIN:

MOV IE, #85H ;使能中断 0,1

SETB TCON2 ;边沿触发

SETB TCON0 ;边沿触发

SJMP $ ;--没有这一句,程序,自己就去执行中断函数了

EXT1:

MOV P2, #0 ;清0,点亮发光二极管

RETI

EXT2:

MOV P2, #0FFH ;置1,关闭

RETI

END

不清楚你指的是什么CPU的汇编?不同的CP∪响应向量中断的方法不完全一样。8086/8088系列CP∪,就是以中断向量表的方式进入中断程序。中断向量表位于RAM区的低地址区,其中存放中断服务程序的地址,每个中断号对应中断向量表中的4个字节,其高地址的16位是中断服务程序的段地址,低地址中16位是中断服务程序的偏移量地址。

而51系列单片机的中断服务程序入口地址,则是固定对应不同的预留地址空间。而预留空间很小,通常不足以放下一段中断服务程序,因此多是在入口地址安排一条转移指令,转到真正的中断处理程序。

早期的Z80是一种8位CPU,则在CPU内部设有一个8位的中断向量寄存器,当产生中断时,是由申请中断的设备提供低8位中断地址,与中断向量寄存器中的高8位拼组成中断服务程序入口地址。因低8垃地址寻址范围只有128子节,对比较长的中断服务的程序,也会设计一条跳转指令转到真正的处理程序。

首先你要说明你用什么汇编(X86/ARM/C51/PIC或其它)

其次,中断是否带循环与返回主程序没关联的

如X86的,RETI就可以从中断中返回主程序

实际上,你直接JMP到程序都没关系,只要清空栈中内容,并保证寄存器不冲突就可以了

以上就是关于汇编语言 中断程序代码全部的内容,包括:汇编语言 中断程序代码、汇编 中断处理程序怎么写、编写检测键盘按下的汇编中断程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存