程序在 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: