使用nasm进行组装时程序显示错误

时间:2016-08-07 12:12:13

标签: assembly operating-system kernel x86-16 gdt

我修改了一个可用代码,使a20行能够切换到保护模式。 但是在汇编代码时会弹出错误。

代码如下:

    lb_a20_check:

    pushf
    push ds
    push es
    push di
    push si

    cli

    xor ax, ax
    mov es, ax

    mov di, 0x0500
    mov si, 0x0510

    mov al, byte [es:di]
    push ax

    mov al, byte [ds:si]
    push ax

    mov byte [es:di], 0x00
    mov byte [ds:si], 0xff

    cmp byte [es:di], 0xff

    pop ax
    mov byte [ds:si], al

    pop ax
    mov byte [es:di], al

    pop si
    pop di
    pop es
    pop ds

    mov ax, 0                ;if memory wrapped - protected mode disabled
    je lb_en_a20

    popf
    mov ax, 1                ;if memory not wrapped
    ret

    lb_en_a20:

        popf

        mov dl, var_temp_a20
        cmp dl, 0x01
        je lb_en_KEYBOARD_a20

        cmp dl, 02
        je lb_en_FAST_a20 

        lb_en_BIOS_a20:

            mov ax, 0x2401
            int 0x15

            inc dl
            mov var_temp_a20, dl

            jmp lb_a20_check

        lb_en_KEYBOARD_a20:

            cli
            call fn_wait_kb_cmd

            mov al, 0xAD             ;disable keyboard
            out 0x64, al

            call fn_wait_kb_cmd

            mov al, 0xD0
            out 0x64, al

            call fn_wait_kb_data

            in al, 0x60
            push eax

            call fn_wait_kb_cmd

            mov al, 0xD1
            out 0x64, al

            call fn_wait_kb_cmd

            pop eax
            or al, 2
            out 0x60, al

            call fn_wait_kb_cmd

            mov al, 0xAE
            out 0x64, al

            call fn_wait_kb_cmd

            sti
            inc dl
            mov var_temp_a20, dl

            jmp lb_a20_check

        lb_en_FAST_a20:

            in al, 0x92
            or al, 02
            out 0x92, al

            inc dl
            mov var_temp_a20, dl

            jmp lb_a20_check

lb_a20_data:

    var_temp_a20 db 0

lb_a20_include_data:

    %include 'include\kb.asm'

代码很简单,但只要我在任何语句中使用内存var_temp_a20,就会弹出错误。

错误说明语句中的操作码或操作数不正确:

mov var_temp_a20, dl
整个计划中到处都是

有人可以解释这个问题吗?

感谢。

0 个答案:

没有答案
相关问题