程序在 Turbo Debugger 中运行,当我单步执行它时,但是当我在 TD 或 DOS 中 运行 它停止并且 Ctrl+Alt+Delete 成为唯一的选项
a program works in Turbo Debugger when I step through it, but when I run it in TD or DOS it stops and Ctrl+Alt+Delete becomes the only option
该程序旨在使用 BIOS int 10h 显示 char table,它确实做到了,但只有当我在 td 中单步执行它时。我认为也许在调试器中未初始化的寄存器包含零,但是 运行 它们可能包含垃圾,因此我用 mov ax, 0003h 而不是 mov al, 3 并添加了 xor dx, dx;但它也不起作用。
.model tiny
.code
org 100h
start:
mov ax, 0003h
int 10h
xor dx, dx
mov si, 256
mov ax, 0900h
mov cx, 1
xor bh, bh
mov bl, 00011111b
cloop:
int 10h
push ax
mov ah, 2
inc dl
int 10h
mov ax, 0920h
int 10h
mov ah, 2
inc dl
int 10h
pop ax
inc al
test al, 0Fh
jnz con_loop
mov ah, 2
inc dh
xor dl, dl
int 10h
pop ax
con_loop:
dec si
jnz cloop
ret
end start
你有一个 pop
指令不对应 push
:
push ax
...
pop ax
inc al
...
int 10h
pop ax <-- HERE
con_loop:
应删除最后一个 pop
。
您需要一个额外的 PUSH。你永远不应该相信 BIOS/DOS/others 会保留 AX,即使它不是输出寄存器。
test al,0Fh
jnz con_loop
push ax ;You forgot this!!!
mov ah,2
inc dh
xor dl,dl
int 10h
pop ax
con_loop:
该程序旨在使用 BIOS int 10h 显示 char table,它确实做到了,但只有当我在 td 中单步执行它时。我认为也许在调试器中未初始化的寄存器包含零,但是 运行 它们可能包含垃圾,因此我用 mov ax, 0003h 而不是 mov al, 3 并添加了 xor dx, dx;但它也不起作用。
.model tiny
.code
org 100h
start:
mov ax, 0003h
int 10h
xor dx, dx
mov si, 256
mov ax, 0900h
mov cx, 1
xor bh, bh
mov bl, 00011111b
cloop:
int 10h
push ax
mov ah, 2
inc dl
int 10h
mov ax, 0920h
int 10h
mov ah, 2
inc dl
int 10h
pop ax
inc al
test al, 0Fh
jnz con_loop
mov ah, 2
inc dh
xor dl, dl
int 10h
pop ax
con_loop:
dec si
jnz cloop
ret
end start
你有一个 pop
指令不对应 push
:
push ax
...
pop ax
inc al
...
int 10h
pop ax <-- HERE
con_loop:
应删除最后一个 pop
。
您需要一个额外的 PUSH。你永远不应该相信 BIOS/DOS/others 会保留 AX,即使它不是输出寄存器。
test al,0Fh
jnz con_loop
push ax ;You forgot this!!!
mov ah,2
inc dh
xor dl,dl
int 10h
pop ax
con_loop: