-->在纯DOS下访问1M以上內存的汇编代码问题。
那天在FAQ上看到在純DOS下訪問1M以上內存的匯編代碼,理论上应该是可行的,想拿来试试,运行后无结果输出.(懷疑是himem惹的禍,去掉以後還是一樣)我在DOS下用debug調試,發現單步到 mov eax,cr0處機子就重啟了,請教大家一下為什麼。(我用的是masm6.00,tasm5.0編譯我沒通過)
.386p
gdt segment use16
gdt_begin label byte
null_desc dq 0
scode dd 0000ffffh
dd 00009a00h
sdata dd 0000ffffh
dd 00cf9200h
gdt_end label byte
gdtr dw 3*8-1
dd 0
gdt ends
cseg segment use16
assume cs:cseg,ds:gdt
start:
mov ax,gdt
mov ds,ax
movzx eax,ax
shl eax,4
mov ebx,offset gdtr
mov [ebx]+2,eax
seta20:
in al,64h
test al,2
jnz seta20
mov al,0d1h
out 64h,al
seta201:
in al,64h
test al,2
jnz seta201
mov al,0dfh
out 60h,al
cli
lgdt fword ptr gdtr ;装载GDT
mov eax,cr0
or eax,1
mov cr0,eax ;进入保护模式
jmp protected_mode ;刷新指令队列
protected_mode:
mov ax,10h
mov ds,ax
mov esi,0110000h ;开始探测内存
begin_test:
mov dl,55h
xchg [esi],dl
xchg [esi],dl
cmp dl,55h
jne end_test
mov dl,0aah
xchg [esi],dl
xchg [esi],dl
cmp dl,0aah
jne end_test
add esi,16
putchr1: ;在屏幕上打印
mov ebx,0b8468h
mov ecx,8
mov eax,esi
putchr:
rol eax,4
mov edx,eax
and al,0fh
add al,30h
cmp al,39h
ja add37
jmp disp
add37:
add al,7
disp:
mov ah,07
mov [ebx],ax
mov eax,edx
add ebx,2
loop putchr
jmp begin_test
end_test:
mov ax,0748h
mov [ebx],ax
mov eax,cr0
and eax,0fffffffeh
mov cr0,eax ;返回实模式
jmp $+2
sti
mov ah,4ch
int 21h
cseg ends
end start