汇编程序编写的读取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)的更多相关文章

  1. DOS下读取PCI配置空间信息的汇编程序(通过IOCF8/IOCFC)

    汇编程序编写的读取PCI配置空间信息的代码(通过IOCF8/IOCFC): ;------------------------------------------------ ;功能: 读取PCI 配 ...

  2. DOS下读取smbios的汇编程序(通过搜索memory)

    汇编程序编写的读取smbios的代码: ;------------------------------------------------- ;功能: 读取SMBIOS 的Entry Point ,并 ...

  3. 二、Delphi10.3在不下载文件情况下读取网站文件大小等信息

    一.上源码 uses TxHttp, Classes, TxCommon, Frm_WebTool, SysUtils; var m_Url: string; m_Http: TTxHttp; m_P ...

  4. Windows mobile 下读取手机SIM卡信息(转)

    Windows mobile 下读取手机SIM卡信息 c#改善 Windows mobile 下读取手机SIM卡信息

  5. udhcp源码详解(三) 下 之配置信息的读取

    上节讲解了read_config函数,读取配置信息到server_config的相应成员变量里,但read_config函数只负责把配置信息重文件里读出来,具体怎么把信息填写到指定的地址内,是调用ke ...

  6. dos下 批处理 用 pause 可以在最后暂停 查看结果信息 build.bat

    dos下 批处理 用 pause 可以在最后暂停 查看结果信息

  7. dos下的edit命令使用详解

    dos下的edit命令使用详解 来源:网络 作者:未知 edit命令是一个简单的编辑软件,我们经常用它来编辑一些程序和批处理文件. 比如,我想在c盘根目录下编辑一个简单的批处理文件,要求无论当前盘和当 ...

  8. ASP.NET Core的配置(1):读取配置信息

    提到"配置"二字,我想绝大部分.NET开发人员脑海中会立马浮现出两个特殊文件的身影,那就是我们再熟悉不过的app.config和web.config,多年以来我们已经习惯了将结构化 ...

  9. EWS API 2.0读取日历信息-读取内容注意事项

    采用模拟账号的方式读取日历信息,注意下日历的内容读取(Body)读取.代码如下:(采用 EWS API 2.0版本) 1.读取内容前必须设置如下属性:否则会提示:You must load or as ...

随机推荐

  1. 用jstl截取字符串

    用jstl截取字符串 2011-08-01 08:55 5485人阅读 评论(0) 收藏 举报 stringfunctionjavahtmljspencoding jstl以前在jsp页面截取字符串时 ...

  2. Bootstrap 模态对话框 remote指定内容加载

    第一个页面: .....其他内容..... <div class="modal" id="ID_ReformDetail"> <div cla ...

  3. Python库 - import matplotlib.pyplot as plt 报错问题

    为了避免各种问题,请使用最新的2.7.13安装文件   1.先设置好环境变量 在path变量中设置好以下路径: C:\Python27\Scripts C:\Python27    2.大部分报错问题 ...

  4. 为女票写的计算工作时间的SQL

    排除非工作时间.非工作日后,计算工作时间,代码如下: -- 删除函数 DROP FUNCTION IF EXISTS calculateWorkingTime; set @workStartTime= ...

  5. 计蒜客NOIP模拟赛(2) D2T3 银河战舰

    [问题描述]    瑞奥和玛德利德是非常好的朋友.瑞奥平时的爱好是吹牛,玛德利德的爱好是戳穿瑞奥吹的牛.    这天瑞奥和玛德利德来到了宇宙空间站,瑞奥向玛德利德炫耀这个空间站里所有的银河战舰都是自己 ...

  6. java 调用存储过程

    1.java 中调用pl/sql 中的存储过程 call 存储过程的名称(参数名称,参数名称)  在service 层中调用  存储过程  String  sql=" call  proc_ ...

  7. PendingIntent的使用

    1, 构造intent Intent mIntent = new Intent("android.intent.action.MAIN"); ComponentName comp ...

  8. sku 加减号的增删

    ---恢复内容开始--- //php页面public function test(){ $id="1"; $data=Db::table('week3_goods') ->j ...

  9. backgroud 应用减小资源大小和请求数

    一,一个典型的应用,利用小图的自动延伸,实现整个网页背景图,充分节约资源宽带.如:汽车之家的404页背景图就是这样 <div style="height: 3000px; backgr ...

  10. Silverlight自定义控件系列 – TreeView (2) 基本布局和States

    TreeView的树形结构都以缩进方式显示,现在来完成这部分. 首先,要定义出每个节点上都包含什么东西.先看看Win7资源管理器的TreeView: 图2.1 资源管理器 一个通用的TreeView至 ...