DOS下读取smbios的汇编程序(通过搜索memory)
汇编程序编写的读取smbios的代码:
1 ;------------------------------------------------- 2 ;功能: 读取SMBIOS 的Entry Point ,并读取SMBIOS 表的前128-byte 3 ;环境: DOS + MASM5 4 ;时间: 2015/08 5 ;-------------------------------------------------- 6 ;功能: 显示ascii 表示的字符 7 echoch macro ascii 8 mov ah,2 9 mov dl,ascii 10 int 21h 11 endm 12 ;------------------------------------- 13 .386P 14 ;--------------- data segment ------------------------ 15 dseg segment use16 16 buff_len = 128 17 buff_ep db buff_len dup(0) ;用来存放entry point的数据 18 ep_offset dw 0000h ;保存ep在内存f段中的偏移地址 19 table_add dd 00000000h ;保存SMBIOS 表在内存中的开始地址 20 buff_tb db buff_len dup(0) ;用来存放table的数据 21 dseg ends 22 ;-------------data segment end ------------------------------ 23 ;----------------code segment -------------------------- 24 cseg segment use16 25 assume cs:cseg, ds:dseg 26 start: 27 mov ax,dseg 28 mov ds,ax 29 ; 30 mov ax,0f000h 31 mov ds,ax 32 mov si,0000h ;从F000:[0000]开始搜索内存 33 continue: 34 mov eax,ds:[si] 35 inc si 36 cmp eax,5f4d535fh ;比较' _SM_' ,这里不能用变量,否则loop 出错? 37 jnz continue ;没找到,继续 38 ; 39 dec si 40 mov ep_offset,si ;ep的偏移地址保存到ep_offset 中 41 ; 42 ;----------------------------------------------------- 43 ;--------------把Entry Point 存到buff_ep中----------- 44 mov ax,0f000h ;设置源地址 45 mov ds,ax 46 mov si,ep_offset 47 ; 48 mov ax,dseg ;设置目的地址 49 mov es,ax ;段地址为数据段的段地址 50 mov di,offset buff_ep ;偏移地址为 buff_ep的偏移地址 51 ; 52 mov cx,20h ;设置循环次数 53 cld ;设置si / di 自增 54 repz movsb ;字符串传送es:[di] <-- ds:[si] , cx-- 55 ;--------------------------------------------------------- 56 ;-------打印buff_ep的内容(以ascii 形式)---------------- 57 mov ax,dseg ;设置源地址 58 mov ds,ax ;段地址 59 mov si,offset buff_ep ;偏移地址 60 mov cx,20h ;设置循环次数 61 cld ;设置si 自增 62 nextline1: 63 dec cx 64 echoch 0dh ;换行 65 echoch 0ah 66 mov bp,16 ;每行显示16 字节 67 nextch1: 68 lodsb ;字符串加载al <-- ds:[si] , si++ 69 ; 70 push ax 71 shr al,4 ;al 的高4位移到低4位 72 call toascii 73 echoch al 74 pop ax 75 call toascii 76 echoch al 77 echoch ' ' 78 ; 79 dec bp 80 jz nextline1 ;bp == 0 ,jmp 81 loop nextch1 82 ;-------打印buff_ep的内容(以字符形式)------------------ 83 mov ax,dseg 84 mov ds,ax 85 mov si,offset buff_ep 86 mov cx,20h 87 cld 88 nextline2: 89 dec cx 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 dec cx 132 echoch 0dh 133 echoch 0ah 134 mov bp,16 135 nextch3: 136 lodsb 137 ; 138 push ax 139 shr al,4 140 call toascii 141 echoch al 142 pop ax 143 call toascii 144 echoch al 145 echoch ' ' 146 ; 147 dec bp 148 jz nextline3 149 loop nextch3 150 ;------打印buff_ep的内容(以字符形式)--------------- 151 mov ax,dseg 152 mov ds,ax 153 mov si,offset buff_tb 154 mov cx,40h 155 cld 156 nextline4: 157 dec cx 158 echoch 0dh 159 echoch 0ah 160 mov bp,16 161 nextch4: 162 lodsb 163 echoch al 164 dec bp 165 jz nextline4 166 loop nextch4 167 ;------------------------------------------------ 168 ;---------------返回 dos----------- 169 mov ah,4ch 170 int 21h 171 ;---------------------------------------- 172 ;函数功能:把al 的低4位转成ascii码,并存入al 173 ;入口参数: al 174 ;出口参数: al 175 toascii proc 176 and al,0fh ;高四位清零 177 add al,90h ;1001_xxxx 178 daa 179 adc al,40h 180 daa 181 ret 182 toascii endp 183 ;------------------------------------------- 184 cseg ends 185 ;------------ code segment end--------------------------------- 186 end start