我正在尝试在程序中打印字符串。当我说出我的指示时
mov ah,9h
mov dx,poruka
int 21h
在call _inst_09
之前打印得很好。但是当我在我的代码中打印如下所示时,它会打印奇怪的东西和字符。 这是工作计划的图片。字符串打印好
这是我在代码
中打印字符串时程序无效的图片这是我的TSR代码
org 100h
NULL equ 000h
ESC equ 001h
KBD equ 060h
EOI equ 020h
Master_8259 equ 020h
zelena equ 02h
main:
mov ah,9h
mov dx,poruka
int 21h
call _inst_09
_inst_09:
cli
xor ax, ax
mov es, ax
;mov ax, [stari_int09_off]
mov bx, [es:09h*4]
mov [stari_int09_off], bx
mov [es:60h*4], bx ; U int60h ubacujemo off od int9h
mov bx, [es:09h*4+2]
mov [stari_int09_seg], bx
mov [es:60h*4+2], bx ; U int60h ubacujemo seg od int9h
mov dx, tastatura
mov [es:09h*4], dx
mov ax, cs
mov [es:09h*4+2], ax
sti
mov ax,3100h
mov dx,500
int 21h
ret
tastatura:
push ax
in al, KBD
mov [kbdata], al
cmp byte[kbdata],20h
je .lup
cmp byte[kbdata],ESC
je .krj
mov al, EOI
out Master_8259, al
pop ax
int 60h ; Vracamo stari interupt 9h
iret
.lup:
mov ax,0b800h ;dont forget 0 before b
mov es,ax
mov bx,word[video]
mov ah, 02h
int 1ah
mov al,dh
mov byte [es:100+bx],al ;also dont forget the byte thing
;inc byte[video]
;inc byte[video]
mov al, EOI
out Master_8259, al
pop ax
iret
.krj:
mov ah,9h
mov dx,poruka
int 21h
ret
stari_int09_seg: dw 0
stari_int09_off: dw 0
kbdata: db 0
key: db 0
video: dw 100
poruka: db 'Poruka.$'
%include "ekran.asm"
这是代码处理。这是一个TSR程序,因此它在运行时会终止并保持驻留状态。当我按下esc按钮时,它应该在屏幕上打印我的字符串(它跳转.krj标签),但它会显示你在第二张图片上看到的内容。当我在调用_inst09之前把我的指令调用之前,就像我说的那样,它会在第一张图片中打印我的字符串。
我认为我的字符串地址已经改变了,这就是为什么它不起作用但我无法弄明白。
如果你能给我一个关于我的代码的直接答案,我将不胜感激。
答案 0 :(得分:1)
使用je .krj
,您可以跳转到调用DOS服务进行打印的例程。您不能在中断处理程序中使用DOS服务,因为在触发中断时DOS可能已被占用
这里最简单的解决方案是使用BIOS电传打字功能0Eh输出到屏幕。为什么不自己写在0B800h的屏幕上,因为你已经在其他地方做过了?
答案 1 :(得分:0)
如果我们跳转到.krj,那么我们还必须通过发送EOI来终止ISR,弹出斧头并以iret结束。最后一次“ret”指令是错误的。