TSR计划中的Nasm打印字符串

时间:2014-11-04 22:14:31

标签: string assembly dos nasm

我正在尝试在程序中打印字符串。当我说出我的指示时

mov ah,9h
mov dx,poruka
int 21h
call _inst_09之前

打印得很好。但是当我在我的代码中打印如下所示时,它会打印奇怪的东西和字符。 This is picture of program working.这是工作计划的图片。字符串打印好

asdd这是我在代码

中打印字符串时程序无效的图片

这是我的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之前把我的指令调用之前,就像我说的那样,它会在第一张图片中打印我的字符串。
我认为我的字符串地址已经改变了,这就是为什么它不起作用但我无法弄明白。
如果你能给我一个关于我的代码的直接答案,我将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

如果我们跳转到.krj,那么我们还必须通过发送EOI来终止ISR,弹出斧头并以iret结束。最后一次“ret”指令是错误的。