当前位置: 代码迷 >> 汇编语言 >> 求解:在保护模式下读取内存的方法?该怎么解决
  详细解决方案

求解:在保护模式下读取内存的方法?该怎么解决

热度:7691   发布时间:2013-02-26 00:00:00.0
求解:在保护模式下读取内存的方法?
现在有如下程序,是读取内存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一下准备内存块来与那些额外的内存之间进行传输。
------解决方案--------------------------------------------------------
探讨
引用:
1。进保护模式
2。把某个段选择器(DS/ES/FS/GS/SS)设成基址0,限长4G-1
3。返回实模式

好了,现在你可以用这个段寄存器来访问扩展内存了



知道GDT 64bit的内容,怎么得到GDTR的内容? 都说GDT是根据GDTR的32位基地址和16位的table limit 但是他跟GDT内容有什么联系和区别?

------解决方案--------------------------------------------------------
那是MASM简化段定义默认的