现在有如下程序,是读取内存1M以外的程序,我在网上搜了很多关于从实模式切换到保护模式的用法,但是说的很模糊,没有具体用法。求高手帮助。比如下面此程序,如何加上从实模式切换的保护模式的程序才能读取,加到什么地方,代码段,数据段,还是程序开始部分,具体怎么加呢,是不是每一部分都要写什么描述段,很迷茫,还有程序退出时是不是要从保护模式切换回实模式,一定要这样加吗?
.model large
.386p
.stack 100
.data
.code
.startup
mov ax,@data
mov ds,ax
push 0
pop fs
mov eax,00010000h
mov eax,dward ptr fs:[eax]
mov cx,8
fpp:
rol eax,4
push eax
and al,0fh
call ascii
mov dl,al
call display_
pop eax
loop fpp
.exit
display_ proc far
push ax
mov ah,2
int 21h
pop ax
ret
display_ endp
ascii proc far
cmp al,10
jb lab
add al,07h
lab:add al,30h
ret
ascii endp
end
请用上面程序举例!!!
------解决方案--------------------------------------------------------
切换相当复杂 各种描述符 描述符表 TSS都需要自己建立 杨季文的书写的很多了 仅仅是多
------解决方案--------------------------------------------------------
实模式的内存范围是1M,所以要访问1M以外的内存,要在保护模式下。
所以你要知道如何从实模式进入保护模式,又因为在保护模式下,涉及到权限问题,
所以不能使用DOS下的中断,所以如果想退出,就要先返回实模式,然后再:
mov ax,4c00h
int 21h
------解决方案--------------------------------------------------------
DOS下要访问1MB以上的内存,可以用BIOS调用INT 15H。不过如果已经加载了HIMEM.SYS甚至EMM386.EXE,就不要用BIOS本来的INT 15H了,但是它们都扩展了INT 15H,可以用那些扩展功能。
XMS是HIMEM.SYS建立的,EMS是EMM386.EXE用XMS模拟出来的,因为后者使用更简单一些,而且早期程序用EMS的多,XMS是后来者。
EMS使用INT 67H、INT 15H(AH=40H~46H)调用,XMS用INT 2FH(AH=43H调用,AL=子功能)。
INT15H的扩展功能提供转换为保护模式的功能,不过一般都不主动转,而是让那些内存管理器来转,自己写的程序不设计保护模式操作,你只需要在1MB一下准备内存块来与那些额外的内存之间进行传输。
------解决方案--------------------------------------------------------
------解决方案--------------------------------------------------------
那是MASM简化段定义默认的