我修改了一个可用代码以使 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
在整个程序中无处不在。
任何人都可以解释这个问题吗?
谢谢。