华硕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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值