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 ...
随机推荐
- MyBatis——一对多、一对一关系,collection、association
实体类两个: user类: package com.pojo; /** *用户 */ public class User{ private int userId;//用户ID private Stri ...
- spark sql的agg函数,作用:在整体DataFrame不分组聚合
.agg(expers:column*) 返回dataframe类型 ,同数学计算求值 df.agg(max("age"), avg("salary")) df ...
- [django]django权限简单实验
djagno https://www.jianshu.com/p/01126437e8a4 开始我一直没明白内置的view_car 怎么实现view 只读库的. 后来发现这个api需要在views.p ...
- CentOS下samba配置心得(smb和nmb都要启动)
印象中以前多次配置成功过,重新配置就把以前的资料找出来: yum安装 samba samba-client samba-swat,然后配置参见:http://www.cnblogs.com/mchin ...
- 阿里云服务器用smtp发送邮件返失败
阿里云使用SMTP发送邮件失败,因为阿里云服务器屏蔽了25端口,所以发送不成功,解决办法改用587发送QQ邮件,且必须使用SSL,否则不成功. 经测试QQ的465,995不能使用. https://b ...
- Dockerfile详解(三)
1.概述 创建Docker镜像的方式有三种 docker commit命令:由容器生成镜像: Dockerfile文件+docker build命令: 从本地文件系统导入:OpenVZ的模板. 关于这 ...
- phpstudy的使用
1.第一步是下载phpstudy,你可以百度去下载,也可以通过下面我分享的网盘下载 链接:https://pan.baidu.com/s/1E_CXIrKv1N-jrlA4KCovZA 密码:mkx9 ...
- HDU 2604 Queuing(递推+矩阵)
Queuing [题目链接]Queuing [题目类型]递推+矩阵 &题解: 这题想是早就想出来了,就坑在初始化那块,只把要用的初始化了没有把其他的赋值为0,调了3,4个小时 = = 本题是可 ...
- /*使用PHP创建一个数组,保存5個员工的信息(ename/sex/salary/birthday/pic)*/
<?php/*使用PHP创建一个数组,保存5個员工的信息(ename/sex/salary/birthday/pic)*/$empList=[ ['ename'=>'张学友','se ...
- 提示“此Flash Player与您的地区不相容,请重新安装Flash”的解决办法
问题原因: 因为Flash相对于HTML5,有着运算效率低.资源占用大.安全性不高等缺点,随着HTML5越来越普及,Adobe已宣布2020年正式停止支持Flash这项技术. 但Adobe公司为了利益 ...