码迷,mamicode.com
首页 > 移动开发 > 详细

汇编读取SMBIOS

时间:2015-08-31 21:10:37      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:

学习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

 

汇编读取SMBIOS

标签:

原文地址:http://www.cnblogs.com/nju347/p/4773797.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!