中断指令 int n ---汇编语言基础语法

来自 https://blog.csdn.net/fivedoumi/article/details/8003002

int 指令
格式:int n
含义:n为中断类型码,用于引发中断过程。
执行过程:
1)取中断类型码n;
2)标志寄存器入栈,IF=0,TF=0;
**跟踪标志:**当TF被设置为1时,CPU进入单步模式,所谓单步模式就是CPU在 每执行一步指令后都产生一个单步中断。主要用于程序的调试。8086/8088中没有专门用来置位和清零TF的命令,需要用其他办法。
**中断标志:**决定CPU是否响应外部可屏蔽中断请求。IF为1时,CPU允许响应外部的可屏蔽中断请求。
3)CS、IP入栈
4)(IP)=(n4),(CS)=(n4+2)

编写中断处理程序的步骤
可以供应用程序调用的中断例程的编写方法。
例题:编写、安装中断7ch的中断全程,功能:求一word型数据的平方。
参数:(ax)=要计算的数据。

返回值:dx、ax中存放结果的高16位和低16位。

应用举例:求2*3456^2

assume cs:code
code segment
start:    mov ax,3456                 ;(ax)=3456
              int 7ch                         ;调用中断7ch的中断例程,计算ax中的数据的平方
              add ax,ax
              adc dx,dx                            ;dx:ax存放结果,将结果乘以2
              mov ax,4c00h
              int 21h          
code ends
end start

分析 我们要做的三部分工作:
1)编写实现平方功能的程序
2)安装程序,将其安装在0:200处
3)设置中断向量表,将程序的入口地址保存在7ch表项中,使其成为中断7ch的中断例程。

assume cs:code

code segment

 start:       mov ax,cs
              mov ds,ax
              mov si, offset sqr          ;设置ds:si指向源地址
              mov ax,0
              mov es,ax
              mov di, 200h                ;设置es:di指向目的地址
              mov cx, offset sqrend – offset sqr              ;设置cx为传输长度
              cld                               ;设置传输方向为正
              rep movsb
              mov ax,0
              mov es,ax
              mov word ptr es:[7ch*4],200h     ;设置中断向量表 偏移地址
              mov word ptr es:[7ch*4+2],0              ;设置中断向量表,段地址
              mov ax,4c00h
              int 21h

        sqr:  mul ax
              iret
sqrend: nop
code ends
end start

(iret指令的功能为:
pop IP
pop CS
popf
用于释放资源,返回原来的应用程序)
CPU执行int 7ch指令进入中断例程之前,标志寄存器、当前的CS和IP被压入栈中,在执行完中断例程后,应该用iret指令恢复int 7ch执行前的标志寄存器和CS、IP的值,从而接着执行应用程序。
int指令和iret指令的配合使用与call指令和ret指令的配合使用具有相似的思路。
与cs+ip的调用寻址也有相似的寻址思路。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来给您解答。以下是汇编语言编程实现轮流采集ADC0809 int0-int7的信号的步骤: 1. 首先,需要定义一些变量来存储ADC0809的控制字和数据字。例如: ``` CTRL equ 80h ; 控制字存储地址 DATA equ 81h ; 数据字存储地址 ``` 2. 然后,需要初始化ADC0809的控制字,使其能够采集int0-int7的信号。具体地,需要设置控制字的位7为0、位6为1(表示单通道模式)、位5-位3为000(表示int0-int7)、位2-位1为00(表示时钟分频系数为2)、位0为1(表示启动转换)。例如: ``` mov al, 00000001b ; 设置控制字 out CTRL, al ; 输出控制字到ADC0809 ``` 3. 接下来,需要等待ADC0809完成转换并将转换结果存储在数据字中。可以通过轮询的方式等待,直到ADC0809的转换完成标志位(位7)为1。例如: ``` wait: in al, CTRL ; 读取控制字 test al, 10000000b ; 测试转换完成标志位 jz wait ; 如果转换未完成,则继续等待 ``` 4. 转换完成后,可以从数据字中读取转换结果,并将其存储到指定的变量中。例如: ``` in al, DATA ; 读取数据字 mov result, al ; 存储转换结果到指定变量 ``` 5. 最后,需要修改控制字中的通道选择位,以便下一次采集不同的信号。可以通过循环左移的方式实现。例如: ``` rol al, 1 ; 循环左移控制字 out CTRL, al ; 输出修改后的控制字到ADC0809 ``` 综上所述,以上就是汇编语言编程实现轮流采集ADC0809 int0-int7的信号的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值