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段写呢