用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