gpt4 book ai didi

assembly - ISR 后程序不断返回同一行。 (总成 8086)

转载 作者:行者123 更新时间:2023-12-04 06:19:32 25 4
gpt4 key购买 nike

我正在处理中断并且在运行我的代码时遇到了这个问题:

DATA SEGMENT
INPUTV DW 0035H, 0855H, 2011H, 1359H
OUTPUTV DB 4 DUP(0)
DIVIDER DB 09
ERROR_FLAG DB 0
DATA ENDS

_STACK SEGMENT STACK
DW 100 DUP(0)
TOP_STACK LABEL WORD
_STACK ENDS

CODE SEGMENT
ASSUME CS:CODE, DS:DATA, SS:_STACK
MAIN:
MOV AX, _STACK
MOV SS, AX
MOV SP, OFFSET TOP_STACK
MOV AX, DATA
MOV DS, AX

MOV AX, 0000H
MOV ES, AX
MOV WORD PTR ES:0002, SEG INT_PROC ;PUSHING CS TO STACK
MOV WORD PTR ES:0000, OFFSET INT_PROC ;PUSHING IP TO STACK

MOV SI, OFFSET INPUTV
MOV BX, OFFSET OUTPUTV

MOV CX, 4H
REPEAT:
MOV AX, [SI]
DIV DIVIDER
CMP ERROR_FLAG, 1H
JE ERROR_ENCOUNTER
MOV [BX], AL
JMP SKIP
ERROR_ENCOUNTER:
MOV BYTE PTR [BX], 0H
MOV ERROR_FLAG, 0H
SKIP:
ADD SI,2
INC BX
LOOP REPEAT
INT 3H
CODE ENDS

INT_SEG SEGMENT
ASSUME CS:INT_SEG
INT_PROC PROC
MOV ERROR_FLAG, 1
IRET
INT_PROC ENDP
INT_SEG ENDS

END MAIN

程序从IRET指令从ISR(这里是INT_PROC)返回后

    INT_PROC PROC
MOV ERROR_FLAG, 1
IRET

它正在执行行:

    DIV DIVIDER

一次又一次,而它应该去:

    CMP ERROR_FLAG, 1H

Debugging Image Here

我在论坛上看到的也是这样说的:

Where the program counter goes after returning the interrupt handler?

为什么会这样,我该如何解决?请帮忙。

最佳答案

x86 架构定义了三类软件生成的中断:

  • 陷阱,明确和故意调用的中断。这些通常是 INT 指令的结果,本身并不表示有问题。推送的 IP 是后续指令的 IP,因此在处理程序返回后,不会重试该指令。或者,如果无法解决故障,它可能会终止进程。
  • 错误,例如页面错误和被零除。这些指示未完成的指令。推送的IP是产生故障的指令的IP;中断处理程序有机会尝试清除问题(最常见的是,通过在导致页面错误的内存页面中进行分页),然后重试指令。
  • Aborts,一种不常见的故障类型,基本上无法恢复(除非通过终止进程)。中断处理程序不应返回。

在被零除的情况下,继续执行除法并不是一个好的响应,因为这样就跳过了一条指令。实际上,这些更像是中止而不是故障。不应使用中断处理程序来破解“替代行为”。

关于assembly - ISR 后程序不断返回同一行。 (总成 8086),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34704121/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com