汇编程序编写的读取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. PHPUnit单元测试的简单使用

    何为单元测试: 指对软件中的基本单元进行测试,如函数.方法等,以检查其返回值或行为是否符合预期:实际中软件是很复杂的,由许多组件构成,执行流程连贯在一起,要进行单元片段的测试,就需要为其提供执行上下文 ...

  2. [vue]data数据属性及ref获取dom

    data项的定义 this.$refs获取dom 获取不到数据 这样中转下才ok 小结: data里不能用this.$ref. 另外使用visjs时候 view-source:http://visjs ...

  3. crontab 详解

    1.crontab文件格式  {minute} {hour} {day-of-month} {month} {day-of-week} {full-path-to-shell-script} ● mi ...

  4. network error:software caused connection abort

    使用Putty链接阿里云香港服务器报这个错误. vim /etc/ssh/sshd_config 找到如下配置 #ClientAliveInterval 540 #ClientAliveCountMa ...

  5. JMeter登录总是提示用户名不能为空的解决

    已传入参数了呀,还是提示用户名不能为空 解决: 将url拼接上参数 --

  6. koa2的文件上传

    使用koa2搭建文件上传服务,后端代码 const os = require('os'); const path = require('path'); const koaBody = require( ...

  7. android获取通讯记录,sim卡和手机

    //获取手机和手机卡通讯录 public static String getContacts() { String szContacts = ""; szContacts=getP ...

  8. 第二章:Opencv核心類Mat

    Opecv就是做計算機視覺,就是讲图片转换成计算机所能识别的数据 Mat类中由大量的内联函数,主要就是用于提高速度. 一般类型都用rgb,存的时候用CV_8UC3.create函数一般会把原来的空间释 ...

  9. C# dataGridView 如何选中整行?

    this.dataGridView1.SelectionMode =DataGridViewSelectionMode.FullRowSelect; dataGridView1即你的dataGridV ...

  10. docker中crontab无法执行

    1.下载的镜像是ubuntu最简版,默认没有安装crontab 2.业务需求需要crontab 最早解决方案 1.在宿主机里面 1 3  * * * root  cd /data/wwwroot/xx ...