DOS下读取spd信息的汇编程序(通过SMBus)
汇编程序编写的读取spd信息的代码:
;-----------------------------------------------------------
;功能: 通过SMbus 读取内存的SPD 信息
;时间: 2015/09
;环境: DOS + MASM5
;说明: 代码中涉及的smbus规范是基于Intel平台
;---------------------------------------------------------
;功能: 显示ascii 表示的字符
echoch macro ascii
mov ah,
mov dl,ascii
int 21h
endm
;---------------------------------------------------------
.386P
;-------------------- data segment ---------------------------------
dseg segment use16
busnum dw 0000h ;总线号0 - 00FFh
devnum dw 001fh ;设备号0 - 001Fh
funnum dw 0007h ;功能号0 - 0007h
regnum dw 00ffh ;寄存器0 - 00FFh
;
sm_base dw 0000h ;存放smbus 基地址
sm_devnum dw 0000h ;a0/a2/a4/a6
sm_regnum dw 0000h ;
;
bufferlen =
buffer db bufferlen dup() ;存放spd 128-byte的信息
buffer1 db 'smbus base address :'
buffer2 db 'device index :'
dseg ends
;-------------------- data segment end ----------------------------------
;-------------------- code segment ---------------------------------
cseg segment use16
assume cs:cseg, ds:dseg
start:
mov ax,dseg
mov ds,ax
;----------------------扫描PCI ---------------------
mov busnum,0000h
mov devnum,0000h
mov funnum,0000h
mov regnum,0000h
nextreg:
call pci_read ;读取pci 配置空间的前4 个字节
cmp ax,0ffffh ;判断设备是否存在
jz nextfun ;不存在,跳到下一个fun
;
add regnum,08h ;读class code
call pci_read
and eax,0ffffff00h
cmp eax,0c050000h ;根据class code 判断SMbus Controller( 0c0500 )
jz find ;是SMbus Controller
nextfun:
mov regnum,0000h
inc funnum
cmp funnum,0007h
ja nextdev ;funnum 大于 7,跳到下一个dev
jmp nextreg
nextdev:
mov regnum,0000h
mov funnum,0000h
inc devnum
cmp devnum,001fh
ja nextbus ;devnum 大于 1fh,跳到下一个bus
jmp nextreg
nextbus:
mov regnum,0000h
mov funnum,0000h
mov devnum,0000h
inc busnum
cmp busnum,0005h
ja notfind ;busnum 大于5,没找到SMbus Controller --结束
jmp nextreg ;--------------------找到SMbus Controller-------------------
find:
sub regnum,08h
add regnum,20h ;SMbus 的基地址在pci 配置空间中的偏移地址
call pci_read ;读取SMbus 的基地址
and ax,0fffeh ;1111_1111_1111_1110,最后一位1 :表示端口方式
mov sm_base,ax ;把基地址保存到sm_base
;
;-----------------------打印smbus 的基地址------------
mov dx,offset buffer1
mov cx,
mov ah,40h
int 21h
;
mov ax,sm_base
shr ax,
push ax
shr al,
call toascii
echoch al
pop ax
call toascii
echoch al
;
mov ax,sm_base
push ax
shr al,
call toascii
echoch al
pop ax
call toascii
echoch al
echoch 0dh ;换行
echoch 0ah
;--------------------读smbus 设备的SPD ----------------
mov sm_devnum,00a0h ;设备a0
;
nextd:
mov sm_regnum,0000h
mov dx,offset buffer2
mov cx,
mov ah,40h
int 21h
;
mov ax,sm_devnum
push ax
shr al,
call toascii
echoch al
pop ax
call toascii
echoch al
echoch ' '
;
call sm_read ;读128-byte 的spd,存入buffer , 并显示buffer
echoch 0dh ;换行
echoch 0ah
add sm_devnum, ;设备号a0/a2/a4/a6
cmp sm_devnum,0a8h
jl nextd ;小于,循环
;----------------------------------------
;--------------结束,返回DOS -------------
notfind:
mov ah,4ch
int 21h
;---------------------------------------------
;------------------子程序----------------
;----------------------------------------
;功能: 通过smbus IO registers 读取spd 信息,并存入buffer
;入口:
;
sm_read proc
push dx
push ax
;
mov ax,dseg ;设置目的地址(buffer 的地址)
mov es,ax ;段地址为数据段地址
mov di,offset buffer ;偏移地址为缓冲区的偏移地址
nextch:
;----------smbus 访问规范--------
call iodelay
mov dx,sm_base ;SMbus 的基地址
add dx,00h ;status register
mov al,0feh ;
out dx,al
call iodelay ;延时
;
mov dx,sm_base
add dx,04h ;slave address register
mov ax,sm_devnum ;从设备地址:a0/a2/a4/a6 ,
or al,01h ;末位:1 - 表示读
out dx,al
call iodelay
;
mov dx,sm_base
add dx,03h ;command register
mov ax,sm_regnum ;寄存器索引
out dx,al
call iodelay
inc sm_regnum
;
mov dx,sm_base
add dx,02h ;control register
mov al,48h ;设置读写模式:字节(48h)、字(4ch)、块(54h)
out dx,al
call iodelay
call iodelay
;
mov dx,sm_base
add dx,00h
in al,dx
cmp al,04h ;判断读结果
jz enderr ;读出错,设备不存在,返回
;
mov dx,sm_base
add dx,05h ;data0 register
in al,dx ;回读数据
mov es:[di],al ;数据保存到buffer 中
inc di
cmp sm_regnum,7fh
ja endsm ;128-byte 读完
jmp nextch
endsm: ;读完结束,打印buffer 后,结束
call print_buffer
pop ax
pop dx
ret
enderr: ;读出错结束,直接退出
pop ax
pop dx
ret
sm_read endp
;--------------------------------------------------
;功能:延时,等待外设把数据准备好
;
iodelay proc
push cx
mov cx,0ffffh
delay:
loop delay
mov cx,0ffffh
delay1:
loop delay1
pop cx
ret
iodelay endp
;---------------------------------------------
;功能: 根据eax中的地址读取pci的配置空间,并存入eax
;入口: busnum、devnum、funnum、regnum
;出口: eax
;
pci_read proc
;protect register
push ebx
push dx
;clear
xor eax,eax
xor ebx,ebx
;enable
add eax,1h
shl eax,
;bus number
mov ebx,ds:[]
and ebx,0ffh
shl ebx,
add eax,ebx
;device number
xor ebx,ebx
mov ebx,ds:[]
and ebx,0ffh
shl ebx,
add eax,ebx
;function number
xor ebx,ebx
mov ebx,ds:[]
and ebx,0ffh
shl ebx,
add eax,ebx
;register
xor ebx,ebx
mov ebx,ds:[]
and ebx,0ffh
add eax,ebx
;read IO
mov dx,0cf8h
out dx,eax
mov dx,0cfch
in eax,dx
;resume register
pop dx
pop ebx
ret
pci_read endp
;----------------------------------------------
;功能:打印buffer的内容(以ascii 形式)
;
print_buffer proc
push ax
push ds
push si
push cx
push bp
;
mov ax,dseg ;设置源地址(buffer 的地址)
mov ds,ax
mov si,offset buffer
mov cx,bufferlen
cld
nextline3:
dec cx
echoch 0dh
echoch 0ah
mov bp,
nextch3:
lodsb ;加载一个字节到al
;
push ax
shr al,
call toascii
echoch al
pop ax
call toascii
echoch al
echoch ' '
;
dec bp
jz nextline3
loop nextch3
;
pop bp ;出栈顺序与入栈顺序相反
pop cx
pop si
pop ds
pop ax
ret
print_buffer endp
;----------------------------------------
;功能:把al 的低4位转成ascii码,并存入al
;入口: al
;出口: al
toascii proc
and al,0fh ;高四位清零
add al,90h ;1001_xxxx
daa
adc al,40h
daa
ret
toascii endp
;-------------------------------------------
cseg ends
;------------- code segment end --------------------------
end start
DOS下读取spd信息的汇编程序(通过SMBus)的更多相关文章
- DOS下读取PCI配置空间信息的汇编程序(通过IOCF8/IOCFC)
汇编程序编写的读取PCI配置空间信息的代码(通过IOCF8/IOCFC): ;------------------------------------------------ ;功能: 读取PCI 配 ...
- DOS下读取smbios的汇编程序(通过搜索memory)
汇编程序编写的读取smbios的代码: ;------------------------------------------------- ;功能: 读取SMBIOS 的Entry Point ,并 ...
- 二、Delphi10.3在不下载文件情况下读取网站文件大小等信息
一.上源码 uses TxHttp, Classes, TxCommon, Frm_WebTool, SysUtils; var m_Url: string; m_Http: TTxHttp; m_P ...
- Windows mobile 下读取手机SIM卡信息(转)
Windows mobile 下读取手机SIM卡信息 c#改善 Windows mobile 下读取手机SIM卡信息
- udhcp源码详解(三) 下 之配置信息的读取
上节讲解了read_config函数,读取配置信息到server_config的相应成员变量里,但read_config函数只负责把配置信息重文件里读出来,具体怎么把信息填写到指定的地址内,是调用ke ...
- dos下 批处理 用 pause 可以在最后暂停 查看结果信息 build.bat
dos下 批处理 用 pause 可以在最后暂停 查看结果信息
- dos下的edit命令使用详解
dos下的edit命令使用详解 来源:网络 作者:未知 edit命令是一个简单的编辑软件,我们经常用它来编辑一些程序和批处理文件. 比如,我想在c盘根目录下编辑一个简单的批处理文件,要求无论当前盘和当 ...
- ASP.NET Core的配置(1):读取配置信息
提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...
- EWS API 2.0读取日历信息-读取内容注意事项
采用模拟账号的方式读取日历信息,注意下日历的内容读取(Body)读取.代码如下:(采用 EWS API 2.0版本) 1.读取内容前必须设置如下属性:否则会提示:You must load or as ...
随机推荐
- Android使用SpannableString设置多样式文本
Android将一行文本设置为多种样式时,可以使用 SpannableString 来实现 private void setTips(){ String big = "大字深色"; ...
- (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
在linux环境下配置项目运行环境时,部署的人员都会分配一下内存,以保证程序正常的运行.其实在开发的时候(window系统),就已经涉及到内存分配了,只是这些参数有默认值,因此一直没有去重视它. 以M ...
- datetime函数和random.seed()函数的应用
一,datetime 在python中datetime是一个库是一个模块也是一个函数,作用很多,这里面只对其做简单的最常用的讲解. 首先返回系统时间 import datetime nowTime=d ...
- xcode 各版本下载地址及其它工具下载地址
官方下载地址:https://developer.apple.com/downloads/
- 49.CSS--- 特殊css3效果展示
1.设置多行文本超出显示省略号<div class="caption"> <p>显示超过两行就显示省略号,其余隐藏,隐藏不了的情况下给这个模块添加一个高度和 ...
- Linux 重启nginx
重启 1.验证nginx配置文件是否正确 方法一:进入nginx安装目录sbin下,输入命令./nginx -t 看到如下显示nginx.conf syntax is ok nginx.conf te ...
- sqli-labs(四)
第七关: 输入?id=1 页面显示如下,可以看出这关大概是锻炼利用sql来写入一句话木马. 这里说我下我的探测流程(主要是为了知道后台的sql是怎样拼凑的): 输入?id=1' 报错 说明后台是用的 ...
- Spark以yarn-client提交任务时报错超时,Connection to 192.168.. /has been quiet forms while there are outstanding requests. Failed to send RPC.....
报错信息如上,具体是运行FusionInsight给的样例SparkPi,在local环境下是可以的,但是如果以yarn-client模式就会卡住,然后120s以后超时,其实以yarn-cluster ...
- 笔记 : windows系统下 命令行 php --version 的版本与phpinfo()版本不一致问题
第一 : php --version命令cmd不随wamp中php版本改变而改变的, php命令是随着wamp安装时将:wamp/bin/php/php5.6.25[版本]自动或手动添加到环境变量, ...
- redis的key越来越多,对速度是否有影响
---恢复内容开始--- redis存储key是用字典对象的,查询性能几乎和数量级无关,只要保证内存够用就可以了,如果内存不够,会把内存和swap空间交换,这种情况下就会很影响性能,会读取出现读取磁盘 ...