2010-12-01 58 views
1

我有一个程序,应该清除屏幕并打印我的名字,然后换行并再次打印我的名字。但是当我运行它时什么都没有显示出来。只是程序正常运行。我在使用调试的Windows命令提示符下执行此操作。装配程序帮助

call 010E 
    call 0125 
    call 012D 
    call 0125 
    int 20 

    push ax  #clearscreen(010E) 
    push bx 
    push cx 
    push dx 
    xor al, al 
    xor cx, cx 
    mov dh, 18 
    mov dl, 4f 
    mov bh, 07 
    mov ah, 06 
    int 20 
    pop dx 
    pop cx 
    pop bx 
    pop ax 
    ret 

    mov dx, 0200 #printline(0125) 
    mov ah, 09 
    int 21 
    ret 

    push ax   #new line(012D) 
    push dx 
    mov ah, 02 
    mov dl, 0d 
    int 21 
    mov dl, 0a 
    int 21, 
    pop dx 
    pop ax 
    ret 

    DB' Antarr$ #(0200) 
+0

1)为什么要调试? 2)你为什么确定例程的确切长度? 3)是什么让你认为你的名字将在偏移量0x200? 4)在`clearscreen`中,是int 20还是21? 5)你确定CS和DS是平等的吗? – ruslik 2010-12-01 16:43:18

+0

我确切的长度,因为我手工输入它,然后回去修改调用 – 2010-12-01 16:55:30

+0

我在清除屏幕中将int 20更改为21。这有助于用换行符打印我的名字,但没有清晰的屏幕 – 2010-12-01 17:00:18

回答

2

你的第一个也是最明显的错误是调用int 20终止程序,而不是BIOS中断int 10clearscreen函数。

编辑:但你为什么不使用汇编程序呢?例如,尝试NASM。此外,该程序:Tech,将帮助您找到正确的DOS或BIOS功能。

1

您正试图调用硬件中断(int 20)。由于保护模式,您将无法进入模式20.换句话说,Windows将阻止您直接与硬件通话。