中断指令的数据范围

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了中断指令的数据范围相关的知识,希望对你有一定的参考价值。

参考技术A

INT;0~127
EVENT:0~33
图 3-9-1
(2)中断分离指令
· 中断分离指令的表示: 中断分离指令由指令的允许端 EN、 指令助记符 DTCH
和中断事件的事件号 EVNT 构成。用梯形图或语句表表示如图 3-9-2。 ·中断分离指令的操作:中断分离指令(DTCH)取消中断事件(EVNT)与全部中
断程序之间的联系,并关闭此中断事件 ·数据范围:
EVENT:0~33
(3)中断返回指令
·中断返回指令的表示:中断返回指令由指令助记符 RETI
构成。用梯形图或语句表表示如图 3-9-3。
·中断返回指令的操作:中断返回指令(RETI条件返回)可用
于根据先前逻辑条件从中断返回。
·注意事项:
Micro/WIN 32 自动为各中断程序添加无条件返回。在
编写程序时,用户不必要再书写无条件返回指令了。 中断处理提供了对特殊的内部或外部中断事件的响应。
编写中断服务程序时,使中断程序短小而简单,加快执行速
度而且不要延时过长。否则,未预料条件可能引起主程序控
制的设备操作异常。对于中断服务程序 ,俗语说“越短越好,”这是绝对正确的。
在中断程序内不能使用 DISI、ENI、HDEF、LSCR、END指令。
图 3-9-3
(4)中断允许指令
·中断允许指令的表示:中断允许指令由
指令助记符 ENI构成。用梯形图或语句表
表示如图 3-9-4。 · 中断允许指令的操作:中断允许指令
(ENI)指令全局性地启动全部中断事件。 一
旦进入运行模式,就允许执行各个已经激
活的中断事件。
(5)中断禁止指令
·中断禁止指令的表示:中断禁止指令由
指令助记符 DISI 构成。用梯形图或语句表表示如图 3-9-4。
·中断禁止指令的操作:中断禁止指令(DISI)可以全局性地关闭所有中断事件。中断禁止指
令允许中断入队,但不允许启动中断程序。
(6)中断中进一步说明的几个问题
1)关于在中断中调用子程序:从中断程序中可以调用一个嵌套子程序。累加器和逻辑堆栈
在中断程序和被调用的子程序中是共用的。
2)关于共享数据:可以在主程序和一个或多个中断程序间共享数据。例如,用户主程序的某
个地方可以为某个中断程序提供要用到的数据,反之亦然。如果用户程序共享数据,必须考
虑中断事件异步特性的影响,这是因为中断事件会在用户主程序执行的任何地方出现。共享
数据一致性问题的解决要依赖于主程序被中断事件中断时中断程序的操作。
这里有几种可以确保在用户主程序和中断程序之间正确共享数据的编程技巧。 这些技巧
或限制共享存储器单元的访问方式,或让使用共享存储器单元的指令序列不会被中断。
语句表程序共享单个变量。如果共享数据是单个字节、字、双字变量,而用户程序用
STL 编写,那么通过把共享数据操作得到的中间值,只存储到非共享的存储器单元或累加器中,可以保证正确的共享访问。
梯形图程序共享单个变量。如果共享数据是单个字节、字或双字变量,而且用户程序用
梯形图编写,那么通过只用 Move 指令(MOVB、MOVW、MOVD、MOVR)访问共享存储器单元,
可以保证正确的共享访问。这些 Move 指令执行时不受中断事件影响。
语句表或梯形图程序共享多个变量,如果共享数据由一些相关的字节、字或双字组成,
那么可以用中断禁止/允许指令(DISI 和 ENI)来控制中断程序的执行。在用户程序开始
对共享存储器单元操作的地方禁止中断,一旦所有影响共享存储器单元的操作完成后,再允
许中断,但这种方法会导致对中断事件响应的延迟。
3)关于通讯口中断:
PLC 的串行通讯口可由梯形图或语句表程序来控制。通讯口的这种操作模式称为自由端
口模式。在自由端口模式下,用户可用程序定义波特率、每个字符位数、奇偶校验和通讯协
议。利用接收和发送中断可简化程序对通讯的控制。
4)关于I/O中断:
I/O 中断包含了上升沿或下降沿中断、高速计数器中断和脉冲串输出(PTO)中断。 S7
-200 CPU 可用输入 I0.0至 I0.3 的上升沿或下降沿产生中断。上升沿事件和下降沿事件可
被这些输入点捕获。 这些上升沿或下降沿事件可被用来指示当某个事件发生时必须引起注意
的条件。
高速计数器中断允许响应诸如当前值等于预置值、 计数器计数方向改变和计数器外部复
位等事件而产生中断。每种高速计数器可对高速事件实时响应,而 PLC 扫描速率对这些高速
事件是不能控制的。脉冲串输出中断给出了已完成指定脉冲数输出的指示。脉冲串输出的一
个典型应用是步进电机。 可以通过将一个中断程序连接到相应的 I/O 事件上来允许上述的每
一个中断。
5)关于时基中断:
时基中断包括定时中断和定时器 T32/T96 中断。CPU 可以支持定时器中断。可以用定时
中断指定一个周期性的活动。周期以 1ms 为增量单位,周期可以从 5ms 到255ms。对定时中
断 0,把周期时间写入 SMB34;对定时中断 1,把周期时间写入 SMB35。每当定时器溢出时,
定时中断事件把控制权交给相应的中断程序。 通常可用定时中断以固定的时间间隔去控制模
拟量输入的采样或者执行一个 PID回路。
当把某个中断程序连接到一个定时中断事件上, 如果该定时中断被允许, 那就开始计时。
在连接期间,系统捕捉周期时间值,因而后来的变化不会影响周期。为改变周期时间,首先
必须修改周期时间值,然后重新把中断程序连接到定时中断事件上。当重新连接时,定时中
断功能清除前一次连接时的任何累计值,并用新值重新开始计时。
一旦允许, 定时中断就连续地运行, 指定时间间隔的每次溢出时执行被连接的中断程序。
如果退出 RUN 模式或分离定时中断,则定时中断被禁止。如果执行了全局中断禁止指令,定
时中断事件会继续出现,每个出现的定时中断事件将进入中断队列等待,直到中断允许或队
列满。
定时器 T32/T96 中断允许及时地响应一个给定时间间隔。 这些中断只支持 lms 分辨率的
延时接通定时器(TON)和延时断开定时器(TOF)T32 和 T96。T32 和 T96 定时器在其它方面
工作正常。一旦中断允许,当有效定时器的当前值等于预置值时,在 CPU 的正常 lms 定时
刷新中,执行被连接的中断程序。首先把一个中断程序连接到 T32/T96 中断事件上,然后允
许该中断。
6)关于中断的优先级和排队:
中断按以下固定的优先级顺序执行。通讯(最高优先级) ,I/O 中断,时基中断(最低
优先级) 。 在各个指定的优先级之内,CPU 按先来先服务的原则处理中断。任何时间点上,只有一
个用户中断程序正在执行。一旦中断程序开始执行,它要一直执行到结束。而且不会被别的
中断程序,甚至是更高优先级的中断程序所打断。当另一个中断正在处理中,新出现的中断
需排队等待处理。
有时,可能有多于队列所能保存数目的中断出现,因而,由系统维护的队列溢出存储器
位表明丢失的中断事件的类型。只在中断程序中使用这些队列溢出存储器位,因为在队列变
空或控制返回到主程序时,这些位会被复位。
7)关于使用中断的限制:
一个程序内最多可有 128 个中断。在各自的优先级范围内,PLC 采用先来先服务的原
则处理中断。在任何时刻,只能执行一个用户中断程序。一旦一个中断程序开始执行,则一
直执行至完成。不能被另一个中断程序打断,即使另一程序的优先级较高。正在处理中断时
发生的新的中断需要排队等待处理。
在中断程序内不能使用 DISI、ENI、HDEF、LSCR 和 END指令。
(7) 中断程序编程步骤
·建立中断程序 INT n(同建立子程序方法相同)
·在中断程序 INT n 中编写其应用程序
·编写中断连接指令(ATCH)
·允许中断(ENI)
·如果需要的话,可以编写中断分离指令(DTCH) 例 3-9-1:图 3-9-5 是一个应用定时中断去读取一个
模拟量的编程例子。
主程序 OB1 有一条语句,其功能是当 PLC 上电以
后首次扫描(SMO.l=1),调用子程序 SBRO,进行初始化。
子程序 SBR0 的功能是设置定时中断。其中,设
定定时中断 0 时间间隔为 l00ms。传送指令 MOV 把
100存入SMB34中, 就是设定定时中断0的时间间隔。
而中断连接指令 ATCH 则把定时中断 0(中断事件号
为 10)和中断程序 0(中断入口为 INT0)连接起来,
并对该事件允许中断。子程序的最后一句是全局允许
中断(ENI) ,只有有了这一条,已经允许中断的中断
事件才能真正被执行。
中断服务程序 INT0 的功能是每中断一次,执行
一次读取模拟量 AIW0 的操作,并将这个数值传送给
VW0。

汇编学习--第十四天

第十二章 内中断

12.1 内中断的产生

发生情况:

  1. 除法错误(除法溢出时等)
  2. 单步执行
  3. 执行into指令
  4. 执行int指令

 

使用中断类型码的数据来标识中断信息的来源。

8086CPU中的中断类型码:

  1. 除法错误:0
  2. 单步执行:1
  3. 执行into指令:4
  4. 执行int指令

 

12.2 中断处理程序

 

12.3 中断向量表

定义:就是中断处理程序入口地址的列表

中断向量表存放着256个中断源所对应的中断处理程序的入口,8086CPU从0000:0000~0000:03FF存放向量表,且不可改变。一个表项,占两个字,高地址存放段地址,低地址存放偏移地址。

 

检测点 12.1

(1)70:018B

(2)4N,4N+2

 

12.4 中断过程

定义:CPU硬件通过中断类型码找到中断向量,并设置CS和IP的过程。

  1. 取得中断类型码
  2. pushf
  3. TF=0,IF=0
  4. push CS
  5. push IP
  6. (CS)=(4N+2), (IP)=(4N)

 

12.5 中断处理程序和iret指令

  1. 中断处理程序编写步骤:
  2. 保存用到的寄存器
  3. 处理中断
  4. 恢复用到的寄存器
  5. 用iret指令返回

iret返回:

pop IP

pop CS

popf

 

12.6 除法错误中断的处理

assume cs:code
code segment
start:
    mov ax,1000h
    mov bh,1
    div bh
code ends
end start

技术图片

IF (interrupt flag)中断标志位由1变为了0

 

12.7 编程处理0号中断

 一般情况下,0000:0200h~0000:02FF的256个字节的空间中断向量表项都是空的,用来存储我们自己的程序。

 

12.8 安装

编译器可以处理表达式

 

12.9 do0

0号中断的处理程序:

  1. 将显示程序保存地址存储到0000:0200中
  2. 设置中断向量表:将0000:0200的段地址与偏移地址保存到0*4+2:0*4处
  3. 编写显示程序

 

12.10 设置中断向量

mov ax,0
mov es,ax
mov word ptr es:[0*4],0200h
mov word ptr es:[0*4+2],0

 

12.11 单步中断

CPU在执行完一段指令之后,如果检测到TF=1,则产生单步中断。

单步中断过程

  1. 取得中断类型码1
  2. 标志寄存器入栈,设置TF,IF为0--避免死循环中断
  3. CS,IP入栈
  4. (IP)=(1*4),(CS)=(1*4+2)

 

12.12 响应中断的处理情况

在执行设置ss和sp地址时,当执行到设置ss地址时,如果产生中断,则ss:sp并不是指向正确的栈顶地址,将产生错误。所以CPU在执行完,设置ss指令后,不产生中断,接着执行下一指令。因此我们正确的设置栈地址指令应为:

mov ax,stacksg
mov ss,ax
mov sp,10h

而不是

mov ax,stacksg
mov ss,ax
mov ax,0
mov sp,10h

 

实验12 编写0号中断的处理程序

assume cs:code
code segment
start:
    mov ax,cs
    mov ds,ax
    mov si,offset do0
    mov ax,0
    mov es,ax
    mov di,200h
    mov cx,offset do0end-offset do0
    cld
    rep movsb
    
    mov word ptr es:[0*4+2],0
    mov word ptr es:[0*4],200h
    
    mov ax,4c00h
    int 21h
    
do0:
    jmp short do0start
    db Biu OverFlow!
    
do0start:
    mov ax,0b800h
    mov es,ax
    mov ax,cs
    mov ds,ax
    mov si,202h
    mov di,12*160+36*2
    mov cx,13
s:
    mov al,ds:[si]
    mov es:[di],al
    mov byte ptr es:[di+1],4
    add di,2
    inc si
    loop s
    
    mov ax,4c00h
    int 21h
    
do0end:nop
    
code ends
end start

用了个测试程序

assume cs:code
code segment
start:
    int 0
code ends
end start

技术图片

 

第十三章 int指令

13.1 int指令

int n相当于引发一个n号的中断处理程序,执行过程

  1. 取中断类型码
  2. 标志寄存器入栈,TF=0,IF=0
  3. CS,IP入栈
  4. (IP)=(4*n),(CS)=(4*n+2)

 

DOSBOX在调试的时候不会自动显示中断信息,而是跳到一个异常地址,所以我只能先把中断程序提前写入,再调用我们的程序。

assume cs:code
code segment
start:
    mov ax,0b800h
    mov es,ax
    mov byte ptr es:[13*160+40*2],!
    int 0
code ends
end start

技术图片

 

13.2 编写供应程序调用的中断例程

问题一:编写,安装中断7ch的中断例程

求一word型数据的平方

例如:2*2345^2

测试用例

assume cs:code
code segment
start:
    mov ax,2345
    int 7ch
    add ax,ax
    adc dx,dx
    
    mov ax,4c00h
    int 21h
code ends
end start

 

中断例程

assume cs:code
code segment
start:
   ;将程序转移到0000:0200 mov ax, cs mov ds,ax mov si,offset square mov ax,
0 mov es,ax mov di,200h mov cx,offset squareend-offset square cld rep movsb ;将程序中断程序入口地址写入中断向量表 mov ax,0 mov es,ax mov word ptr es:[7ch*4+2],0 mov word ptr es:[7ch*4],200h mov ax,4c00h int 21h square: mul ax iret;避免改变标记寄存器等和int组合使用 squareend:nop code ends end start

技术图片

 

技术图片

 

以上是关于中断指令的数据范围的主要内容,如果未能解决你的问题,请参考以下文章

三种例行程序(procdures,function,traps)的使用

将范围变量从控制器绑定到指令而不使用$ watch

考前自学系列·计算机组成原理·查询方式/中断方式/DMA方式的适用范围及判断

指令范围被覆盖

AngularJS指令隔离范围和父范围

将字符串设置为映射到控制器范围内成员的指令属性值