学习SMBIOS:http://blog.csdn.net/zhoudaxia/article/details/5919699
1 ;------------------------------------------------- 2 ; 3 ;程序功能: 读取SMBIOS 4 ;运行环境: DOS + MASM5 5 ;时间: 2015/08/27 6 ; 7 ;-------------------------------------------------- 8 ; 9 echoch macro ascii 10 mov ah,2 11 mov dl,ascii 12 int 21h 13 endm 14 ;------------------------------------- 15 .386P 16 ;--------------------------------------- 17 dseg segment use16 18 buff_len = 128 19 buff_ep db buff_len dup(0);用来存放entry point的数据 20 ep_offset dw 0000h ;保存ep在内存f段中的偏移地址 21 table_add dd 00000000h ;保存SMBIOS 表在内存中的开始地址 22 buff_tb db buff_len dup(0);用来存放table的数据 23 dseg ends 24 ; 25 ;------------------------------------------ 26 cseg segment use16 27 assume cs:cseg, ds:dseg 28 start: 29 mov ax,dseg 30 mov ds,ax 31 ; 32 mov ax,0f000h 33 mov ds,ax 34 mov si,0000h ;从F000:[0000]开始搜索内存 35 continue: 36 mov eax,ds:[si] 37 inc si 38 cmp eax,5f4d535fh ;比较‘ _SM_‘ ,这里不能用变量,否则loop 出错 39 jnz continue ;没找到,继续 40 ; 41 dec si 42 mov ep_offset,si ;ep的偏移地址保存到ep_offset 中 43 ; 44 ;----------------------------------------------------- 45 ;--------------把Entry Point 存到buff_ep中----------- 46 mov ax,0f000h ;设置源地址 47 mov ds,ax 48 mov si,ep_offset 49 ; 50 mov ax,dseg ;设置目的地址 51 mov es,ax ;段地址为数据段的段地址 52 mov di,offset buff_ep ;偏移地址为 buff_ep的偏移地址 53 ; 54 mov cx,20h ;设置循环次数 55 cld ;设置si / di 自增 56 repz movsb ;字符串传送es:[di] <-- ds:[si] , cx-- 57 ;--------------------------------------------------------- 58 ;-------打印buff_ep的内容(以ascii 形式)---------------- 59 mov ax,dseg ;设置源地址 60 mov ds,ax ;段地址 61 mov si,offset buff_ep ;偏移地址 62 mov cx,20h ;设置循环次数 63 cld ;设置si 自增 64 nextline1: 65 echoch 0dh ;换行 66 echoch 0ah 67 mov bp,16 ;每行显示16 字节 68 nextch1: 69 lodsb ;字符串加载al <-- ds:[si] , si++ 70 ; 71 push ax 72 shr al,4 ;al 的高4位移到低4位 73 call toascii 74 echoch al 75 pop ax 76 call toascii 77 echoch al 78 echoch ‘ ‘ 79 ; 80 dec bp 81 jz nextline1 ;bp == 0 ,jmp 82 loop nextch1 83 ;-------打印buff_ep的内容(以字符形式)------------------ 84 mov ax,dseg 85 mov ds,ax 86 mov si,offset buff_ep 87 mov cx,20h 88 cld 89 nextline2: 90 echoch 0dh 91 echoch 0ah 92 mov bp,16 93 nextch2: 94 lodsb 95 echoch al 96 dec bp 97 jz nextline2 98 loop nextch2 99 ;-------------------------------------------------------------------- 100 echoch 0dh 101 echoch 0ah 102 ;---------------读取SMBIOS 的表信息, 存到buff_tb----------------------------- 103 mov si,ep_offset ;恢复ep在f段中的偏移地址 104 mov eax,[si+18h] ;得到strucrute table address 105 ; 106 ;关于strucrute table address : 107 ;(1)如果在1M地址空间之外,需要使用保护模式来访问 108 ;(2)这里我们得到的是000e_6dc0 109 ;(3)如果strucrute table address 大于000F_FFFF, 110 ; 下面的程序就会出错,或得到的值不正确 111 ; 112 mov si,ax ;设置源地址, si = 6dc0 113 shr eax,16 ;0000_000e 114 shl eax,12 ;0000_e000 115 mov ds,ax ;ds = e0000 116 ; 117 mov ax,dseg ;设置目的地址 118 mov es,ax ;段地址为数据段的段地址 119 mov di,offset buff_tb ;偏移地址为 buff_tb的偏移地址 120 mov cx,40h 121 cld 122 repz movsb ;es:[di] <-- ds:[si] , cx-- 123 ;--------------------------------------------------- 124 ;------打印buff_tb的内容(以ascii 形式)-------------- 125 mov ax,dseg 126 mov ds,ax 127 mov si,offset buff_tb 128 mov cx,40h 129 cld 130 nextline3: 131 echoch 0dh 132 echoch 0ah 133 mov bp,16 134 nextch3: 135 lodsb 136 ; 137 push ax 138 shr al,4 139 call toascii 140 echoch al 141 pop ax 142 call toascii 143 echoch al 144 echoch ‘ ‘ 145 ; 146 dec bp 147 jz nextline3 148 loop nextch3 149 ;------打印buff_ep的内容(以字符形式)--------------- 150 mov ax,dseg 151 mov ds,ax 152 mov si,offset buff_tb 153 mov cx,40h 154 cld 155 nextline4: 156 echoch 0dh 157 echoch 0ah 158 mov bp,16 159 nextch4: 160 lodsb 161 echoch al 162 dec bp 163 jz nextline4 164 loop nextch4 165 ;------------------------------------------------ 166 ;---------------返回 dos----------- 167 mov ah,4ch 168 int 21h 169 ;---------------------------------------- 170 ;函数功能:把al 的低4位转成ascii码,并存入al 171 ;入口参数: al 172 ;出口参数: al 173 toascii proc 174 and al,0fh ;高四位清零 175 add al,90h ;1001_xxxx 176 daa 177 adc al,40h 178 daa 179 ret 180 toascii endp 181 ;------------------------------------------- 182 cseg ends 183 end start
时间: 2024-10-16 23:23:11