Assembly 如何在汇编中修改程序中断?

Assembly 如何在汇编中修改程序中断?,assembly,emu8086,interruptions,Assembly,Emu8086,Interruptions,我是汇编程序编程的新手,但我有一个小作业,需要进行大量的思考,我必须修改中断子程序,例如,当我调用int21h时,我想显示一条消息HELLO WORD,或者当我想用0除法时,我想显示数字5,例如,所以我知道向量中断的所有部分是CS:0000,偏移量是0084(对于int21h) 当我想调用int21时,我想让我的微处理器执行另一个程序,可以在[0700:1200]中找到,所以我需要更改内容0000:0084(int21的地址);我试过一个主意 mov[0000],0700 mov[0084],1

我是汇编程序编程的新手,但我有一个小作业,需要进行大量的思考,我必须修改中断子程序,例如,当我调用int21h时,我想显示一条消息HELLO WORD,或者当我想用0除法时,我想显示数字5,例如,所以我知道向量中断的所有部分是CS:0000,偏移量是0084(对于int21h) 当我想调用int21时,我想让我的微处理器执行另一个程序,可以在[0700:1200]中找到,所以我需要更改内容0000:0084(int21的地址);我试过一个主意 mov[0000],0700 mov[0084],1200

但不幸的是,这不起作用 这就是我的例子

org 100 
mov dx,000
push ds
mov ds,dx
lea bx,qwert  
mov [0084h],1500h
int 21h hlt 
org 1200
jmp qwert
pa equ 20h
pb equ 22h`
pc equ 24h
regcontrol equ 26h
tab db 3fh,06h,5bh,4FH,66H,6Dh,7dh,07h,7fh,6fh
com equ 90h
qwert:        
 mov ax,com
out regcontrol,ax 
debut:
mov al,0FFH
OUT pc,al
  call tempo
  mov al,00h
  out pc,al
  call tempo
  jmp debut 
ret   

 proc tempo
    mov cx,7fffh
   ici:nop
   nop
   nop
   nop
   nop
   nop
     loop ici 
       ret
     endp
所以,我想要的是什么时候执行int21h,我想要这个中断直接执行程序qwerty,程序qwerty建立在0700:0112(我使用emu 8086),但int21h直接到f400:1500


我希望你能理解我的意思,并为我的英语不好感到抱歉。现在我把你的问题全部读了一遍。。。有些事情也许值得回答:

所以我知道向量中断的所有部分是CS:0000,偏移量是0084(对于int21h)

这把好几件事搞混了
cs
是寄存器,它与
ip
一起存储下一步要执行的指令的地址(
cs:ip
)。当您在开始时使用自己的代码时,
cs=0700h
,直到您通过
int 21h
跳转到其他地方

中断向量表(包含中断处理例程的地址)位于从
0000:0000
地址开始的内存中

表中的每个条目由四个字节组成,因此
21h
的偏移量为
21h*4=84h
(不是84,而是84h==132)

单个条目的这四个字节是例程的
段:偏移量
地址,偏移量部分存储为第一个字,段部分存储为第二个字(在
0:86h
)。您的原始代码只设置偏移部分,而不设置段,这就是为什么它跳到
F400h:1500h
,您没有更改原始DOS处理程序的旧
F400h

。。。所以我需要更改内容0000:0084(int 21的地址)

是(虽然您想修改21h,所以地址是84h,但您的句子即使对于十进制值也是正确的,如果您想更改
int 15h
,那么地址
0000:0084
将是正确的)

我试过一个想法是mov[0000],0700MOV[0084],1200

否。
mov[0000],0700
ds:0000
处修改内存。重新阅读一些解释:x86 16b实模式中的段:偏移意味着什么(物理地址=段*16+偏移)

因此,当
int 21h
向量位于(从这里开始,所有数字都是十六进制)
0000:0084
时,这意味着它位于物理内存地址
0000*10+0084=00084
。地址处的
0000:0000
int 0
的向量

如果看到
0000:0084
,这不是两个偏移量(修改[0000]和[0084]),而是指向值的第一个字节的单个内存地址。存储32位
段:offset
值意味着将16b偏移部分写入+0和+1字节,将16b段值写入+2和+3字节


因此,如果旧的
int21h
处理程序是例如
F400:DEAD
,那么地址
0000:0084
处的内存包含四个字节:
adde00f4
。在调试器中使用内存视图查看中断表及其初始内容。问题中的原始代码将其修改为
001500 F4
,然后
int21h
跳转到该地址(
F400:1500
)。

您还需要设置中断向量21h远指针的段部分:
mov ax,cs/mov WORD PTR[21h*4+2],ax
。此外,1500小时和1200小时是两个非常不同的数字。注意:代码不可读,有无意义的指令,而且
int 21h hlt
甚至不应该进行汇编。感谢您的回复,对代码表示抱歉,是的,不是1500只是一个错误,但没有任何更改,qwert是一个程序闪烁led,所以我想在调用int 21h时,int21h execute qwert program+的中断程序您能解释一下这些指令如何帮助我吗?每个中断向量有4个字节(段:偏移量)。你只写偏移部分的
mov[0084h],1500h
(为什么不
mov[0084h],bx
,如果你已经做了
lea bx,qwert
?你理解这些指令的作用吗,或者你只是从一些示例中复制/粘贴它们,并尝试在这里和那里更改,直到它起作用为止?)如果你理解Margaret的评论,编辑您的代码,以显示您如何应用该解决方案的最新版本(这是完整的解决方案,因此不清楚您在使用该解决方案时失败的原因,请显示更新的代码和/或询问您不理解的内容,请准确)。int 21的正确地址是
DEAD:BABE
,而不是
F400:DEAD
;-)