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

 

posted @ 2017-09-21 20:08  zhuqingzhu  阅读(626)  评论(0编辑  收藏  举报