String TSR程序中的Nasm打印字符串

String TSR程序中的Nasm打印字符串,string,assembly,dos,nasm,String,Assembly,Dos,Nasm,我正试图在我的程序中打印字符串。当我把我的指令 mov ah,9h mov dx,poruka int 21h 在调用_inst\u 09之前打印效果良好。但当我像下面所示在代码中打印时,它会打印奇怪的东西和字符。 这是工作程序的图片。细绳印得很好 这是当我在代码中打印字符串时程序不工作的图片 这是我的TSR代码 org 100h NULL equ 000h ESC equ 001h KBD equ 060h

我正试图在我的程序中打印字符串。当我把我的指令

mov ah,9h
mov dx,poruka
int 21h
调用_inst\u 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之前输入指令时,正如我之前所说,它将在第一张图片中打印我的字符串lik
我想我的字符串地址不知怎么变了,这就是为什么它不工作,但我无法弄清楚它

如果您能就我的代码给我一个直接的答复,我将不胜感激

如果我们跳到.krj,那么我们还必须通过发送EOI、弹出ax和iret来终止ISR。最后一条“ret”指令错误。

使用
je.krj
可以跳转到调用DOS服务进行打印的例程。不能在中断处理程序中使用DOS服务,因为触发中断时DOS可能已被占用。
这里最简单的解决方案是使用BIOS电传打字功能0Eh输出到屏幕。既然你已经在别的地方写了,为什么不自己在0B800h段写呢