在实模式下取物理内存数!

用BIOS中断 int 15h

输入:

eax 0000e820h

ebx 放置"后续值", 第一次调用时必须为0

ecx 返回数据填充长度,单位字节. 无论ES:DI指向何处,BIOS最多将会填充ECX个字节.不过,通常情况下无论ECX为何值,BIOS只填充20个字节,有些BIOS忽略ECX的值,总是填充20个字节.

edx 0534d4510h ('SMAP')标志值,固定

ES:DI 为返回数据保存地点

输出:

CF=0 为无错误,否则存在错误

eax 0534d4150h ('SMAP')

ebx 为后续值,如果为0则结束,这个后续值在下一次调用时用.

ecx BIOS填充数据的字节数量,最小值为20字节.

ES:DI 为返回数据

 

返回数据结构:

第一个双字 基址的低32位

第二个双字 基址的高32位

第三个双字 长度(字节)的低32位

第四个双字 长度(字节)的高32位

第五个双字 该地址范围内存的类型属性

 

类型属性:

1:可以使用

2:被占用,不可使用

其他未定义.

 

另外一种方法是以下代码,是本站搜索出来的,但经过测试(VPC2007,VMware7,bochs)无法得到正确内存数,不知道他是怎么得出来的,ax单位是Mb!

使用的0x36,0x35寄存器
GetPhysicMem   proc
xor   ax,ax
mov dx,0x70 ;
mov   al,0x36 ;
out dx,al ;
mov dx,0x71 ;
in al,dx ;
mov   ah,al ;
mov dx,0x70 ;
mov   al,0x35 ;
out   dx,al ;
mov   dx,0x71 ;
in al,dx ; 
ret
GetPhysicMem   endp

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值