华硕spd信息_DOS下读取spd信息的汇编程序(通过SMBus)
1 ;-----------------------------------------------------------
2 ;功能: 通过SMbus 读取内存的SPD 信息
3 ;时间: 2015/09
4 ;环境: DOS + MASM5
5 ;说明: 代码中涉及的smbus规范是基于Intel平台
6 ;---------------------------------------------------------
7 ;功能: 显示ascii 表示的字符
8 echoch macro ascii9 mov ah,2
10 movdl,ascii11 int21h12 endm13 ;---------------------------------------------------------
14 .386P15 ;-------------------- data segment ---------------------------------
16 dseg segment use1617 busnum dw 0000h ;总线号0 - 00FFh
18 devnum dw 001fh ;设备号0 - 001Fh
19 funnum dw 0007h ;功能号0 - 0007h
20 regnum dw 00ffh ;寄存器0 - 00FFh
21 ;
22 sm_base dw 0000h ;存放smbus 基地址
23 sm_devnum dw 0000h ;a0/a2/a4/a6
24 sm_regnum dw 0000h ;25 ;26 bufferlen = 128
27 buffer db bufferlen dup(0) ;存放spd 128-byte的信息
28 buffer1 db 'smbus base address :'
29 buffer2 db 'device index :'
30 dseg ends31 ;-------------------- data segment end ----------------------------------
32 ;-------------------- code segment ---------------------------------
33 cseg segment use1634 assume cs:cseg, ds:dseg35 start:
36 movax,dseg37 movds,ax38 ;----------------------扫描PCI ---------------------
39 movbusnum,0000h40 movdevnum,0000h41 movfunnum,0000h42 movregnum,0000h43 nextreg:
44 call pci_read ;读取pci 配置空间的前4 个字节
45 cmp ax,0ffffh ;判断设备是否存在
46 jz nextfun ;不存在,跳到下一个fun
47 ;48 add regnum,08h ;读class code
49 callpci_read50 andeax,0ffffff00h51 cmp eax,0c050000h ;根据class code 判断SMbus Controller( 0c0500 )
52 jz find ;是SMbus Controller
53 nextfun:
54 movregnum,0000h55 incfunnum56 cmpfunnum,0007h57 ja nextdev ;funnum 大于 7,跳到下一个dev
58 jmpnextreg59 nextdev:
60 movregnum,0000h61 movfunnum,0000h62 incdevnum63 cmpdevnum,001fh64 ja nextbus ;devnum 大于 1fh,跳到下一个bus
65 jmpnextreg66 nextbus:
67 movregnum,0000h68 movfunnum,0000h69 movdevnum,0000h70 incbusnum71 cmpbusnum,0005h72 ja notfind ;busnum 大于5,没找到SMbus Controller --结束
73 jmpnextreg74
75 ;--------------------找到SMbus Controller-------------------
76 find:
77 subregnum,08h78 add regnum,20h ;SMbus 的基地址在pci 配置空间中的偏移地址
79 call pci_read ;读取SMbus 的基地址
80 and ax,0fffeh ;1111_1111_1111_1110,最后一位1 :表示端口方式
81 mov sm_base,ax ;把基地址保存到sm_base
82 ;83 ;-----------------------打印smbus 的基地址------------
84 movdx,offset buffer185 mov cx,20
86 movah,40h87 int21h88 ;89 movax,sm_base90 shr ax,8
91 pushax92 shr al,4
93 calltoascii94 echoch al95 popax96 calltoascii97 echoch al98 ;99 movax,sm_base100 pushax101 shr al,4
102 calltoascii103 echoch al104 popax105 calltoascii106 echoch al107 echoch 0dh ;换行
108 echoch 0ah109 ;--------------------读smbus 设备的SPD ----------------
110 mov sm_devnum,00a0h ;设备a0
111 ;112 nextd:
113 movsm_regnum,0000h114 movdx,offset buffer2115 mov cx,14
116 movah,40h117 int21h118 ;119 movax,sm_devnum120 pushax121 shr al,4
122 calltoascii123 echoch al124 popax125 calltoascii126 echoch al127 echoch ' '
128 ;129 call sm_read ;读128-byte 的spd,存入buffer , 并显示buffer
130 echoch 0dh ;换行
131 echoch 0ah132 add sm_devnum,2 ;设备号a0/a2/a4/a6
133 cmpsm_devnum,0a8h134 jl nextd ;小于,循环
135 ;----------------------------------------
136 ;--------------结束,返回DOS -------------
137 notfind:
138 movah,4ch139 int21h140 ;---------------------------------------------
141 ;------------------子程序----------------
142 ;----------------------------------------
143 ;功能: 通过smbus IO registers 读取spd 信息,并存入buffer
144 ;入口:
145 ;146 sm_read proc147 pushdx148 pushax149 ;150 mov ax,dseg ;设置目的地址(buffer 的地址)
151 mov es,ax ;段地址为数据段地址
152 mov di,offset buffer ;偏移地址为缓冲区的偏移地址
153 nextch:
154 ;----------smbus 访问规范--------
155 calliodelay156 mov dx,sm_base ;SMbus 的基地址
157 add dx,00h ;status register
158 mov al,0feh ;159 outdx,al160 call iodelay ;延时
161 ;162 movdx,sm_base163 add dx,04h ;slave address register
164 mov ax,sm_devnum ;从设备地址:a0/a2/a4/a6 ,
165 or al,01h ;末位:1 - 表示读
166 outdx,al167 calliodelay168 ;169 movdx,sm_base170 add dx,03h ;command register
171 mov ax,sm_regnum ;寄存器索引
172 outdx,al173 calliodelay174 incsm_regnum175 ;176 movdx,sm_base177 add dx,02h ;control register
178 mov al,48h ;设置读写模式:字节(48h)、字(4ch)、块(54h)
179 outdx,al180 calliodelay181 calliodelay182 ;183 movdx,sm_base184 adddx,00h185 inal,dx186 cmp al,04h ;判断读结果
187 jz enderr ;读出错,设备不存在,返回
188 ;189 movdx,sm_base190 add dx,05h ;data0 register
191 in al,dx ;回读数据
192 mov es:[di],al ;数据保存到buffer 中
193 incdi194 cmpsm_regnum,7fh195 ja endsm ;128-byte 读完
196 jmpnextch197 endsm: ;读完结束,打印buffer 后,结束
198 callprint_buffer199 popax200 popdx201 ret
202 enderr: ;读出错结束,直接退出
203 popax204 popdx205 ret
206 sm_read endp207 ;--------------------------------------------------
208 ;功能:延时,等待外设把数据准备好
209 ;210 iodelay proc211 pushcx212 movcx,0ffffh213 delay:
214 loop delay215 movcx,0ffffh216 delay1:
217 loop delay1218 popcx219 ret
220 iodelay endp221 ;---------------------------------------------
222 ;功能: 根据eax中的地址读取pci的配置空间,并存入eax
223 ;入口: busnum、devnum、funnum、regnum
224 ;出口: eax
225 ;226 pci_read proc227 ;protect register
228 pushebx229 pushdx230 ;clear
231 xoreax,eax232 xorebx,ebx233 ;enable
234 addeax,1h235 shl eax,31
236 ;bus number
237 mov ebx,ds:[00]238 andebx,0ffh239 shl ebx,16
240 addeax,ebx241 ;device number
242 xorebx,ebx243 mov ebx,ds:[02]244 andebx,0ffh245 shl ebx,11
246 addeax,ebx247 ;function number
248 xorebx,ebx249 mov ebx,ds:[04]250 andebx,0ffh251 shl ebx,8
252 addeax,ebx253 ;register
254 xorebx,ebx255 mov ebx,ds:[06]256 andebx,0ffh257 addeax,ebx258 ;read IO
259 movdx,0cf8h260 outdx,eax261 movdx,0cfch262 ineax,dx263 ;resume register
264 popdx265 popebx266 ret
267 pci_read endp268 ;----------------------------------------------
269 ;功能:打印buffer的内容(以ascii 形式)
270 ;271 print_buffer proc272 pushax273 pushds274 pushsi275 pushcx276 pushbp277 ;278 mov ax,dseg ;设置源地址(buffer 的地址)
279 movds,ax280 movsi,offset buffer281 movcx,bufferlen282 cld
283 nextline3:
284 deccx285 echoch 0dh286 echoch 0ah287 mov bp,16
288 nextch3:
289 lodsb ;加载一个字节到al
290 ;291 pushax292 shr al,4
293 calltoascii294 echoch al295 popax296 calltoascii297 echoch al298 echoch ' '
299 ;300 decbp301 jznextline3302 loop nextch3303 ;304 pop bp ;出栈顺序与入栈顺序相反
305 popcx306 popsi307 popds308 popax309 ret
310 print_buffer endp311 ;----------------------------------------
312 ;功能:把al 的低4位转成ascii码,并存入al
313 ;入口: al
314 ;出口: al
315 toascii proc316 and al,0fh ;高四位清零
317 add al,90h ;1001_xxxx
318 daa
319 adcal,40h320 daa
321 ret
322 toascii endp323 ;-------------------------------------------
324 cseg ends325 ;------------- code segment end --------------------------
326 end start
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!