PMU_DATA equ 68h ;数据端口
RD_EC_SMI equ 80h ;读寄存器命令
POLLING_DATA equ 0E7h ;CPU温度寄存器号
看上面的定义,PMU寄存器读取的步骤是这样的:
1.等待输入缓冲器空,即PMU将上一条命令处理完毕;
1.将命令(RD_EC_SMI)写入命令端口(PMU_SC);
2.等待输入缓冲器空,即PMU将命令(RD_EC_SMI)处理完毕;
3.将要访问的寄存器号(POLLING_DATA)写入数据端口(PMU_DATA);
4.等待输出缓冲器满,即PMU将从寄存器(POLLING_DATA)读出的数据放到输出缓冲器;
5.将数据从数据端口(PMU_DATA)读出。
(说明,这里的输入输出缓冲是指的PMU的缓冲。)
这样,就完成了一次读操作,写操作和其类似。
具体代码如下:
;AL-----CPU Temperature
GetCPUTempe proc
pusha
pushf
cli
mov dx,PMU_SC
mov al,RD_EC_SMI
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al // 将读寄存器命令放到命令端口中。
mov dx,PMU_DATA
mov al,POLLING_DATA
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al // 将CPU温度寄存器号 放到数据端口中
mov dx,PMU_DATA
call pmuWait4OBF ;Must have 输出缓冲为满吗? 有数据则可以读了
in al,dx ;从数据端口中读入数据
sti
popf
popa
GetCPUTempe endp
;#########################################################
pmuWait4IBE proc
PUSH AX
PW4IBE:
IN AL, 06CH ; Read PMU status
TEST AL, 2 ; Is Input Buffer Empty?
JNZ PW4IBE ; Jmp if no
POP AX
ret
pmuWait4IBE endp;END OF PMUWAIT4IBE
;#########################################################
pmuWait4OBF proc
PUSH AX
PW4OBF:
IN AL, 06CH ; Read PMU status
TEST AL, 1 ; Is Output Buffer Full?
JZ PW4OBF ; Jmp if no
POP AX
ret
pmuWait4OBF endp;END OF PMUWAIT4OBF
;#########################################################
谢谢
18 个解决方案
#1
为什么没人来回答,急啊
#2
汇编可以通过:
data segment
PMU_SC equ 6Ch ;命令端口
PMU_DATA equ 68h ;数据端口
RD_EC_SMI equ 80h ;读寄存器命令
POLLING_DATA equ 0E7h ;CPU温度寄存器号
data ends
code segment
assume cs:code,ds:data
start:
GetCPUTempe proc
pushf
cli
mov dx,PMU_SC
mov al,RD_EC_SMI
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al ; 将读寄存器命令放到命令端口中。
mov dx,PMU_DATA
mov al,POLLING_DATA
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al ;将CPU温度寄存器号 放到数据端口中
mov dx,PMU_DATA
call pmuWait4OBF ;Must have 输出缓冲为满吗? 有数据则可以读了
in al,dx ;从数据端口中读入数据
sti
popf
GetCPUTempe endp
;#########################################################
pmuWait4IBE proc
PUSH AX
PW4IBE:
IN AL, 06CH ; Read PMU status
TEST AL, 2 ; Is Input Buffer Empty?
JNZ PW4IBE ; Jmp if no
POP AX
ret
pmuWait4IBE endp;END OF PMUWAIT4IBE
;#########################################################
pmuWait4OBF proc
PUSH AX
PW4OBF:
IN AL, 06CH ; Read PMU status
TEST AL, 1 ; Is Output Buffer Full?
JZ PW4OBF ; Jmp if no
POP AX
ret
pmuWait4OBF endp;END OF PMUWAIT4OBF
mov ah,4ch
int 21h
code ends
end start
data segment
PMU_SC equ 6Ch ;命令端口
PMU_DATA equ 68h ;数据端口
RD_EC_SMI equ 80h ;读寄存器命令
POLLING_DATA equ 0E7h ;CPU温度寄存器号
data ends
code segment
assume cs:code,ds:data
start:
GetCPUTempe proc
pushf
cli
mov dx,PMU_SC
mov al,RD_EC_SMI
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al ; 将读寄存器命令放到命令端口中。
mov dx,PMU_DATA
mov al,POLLING_DATA
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al ;将CPU温度寄存器号 放到数据端口中
mov dx,PMU_DATA
call pmuWait4OBF ;Must have 输出缓冲为满吗? 有数据则可以读了
in al,dx ;从数据端口中读入数据
sti
popf
GetCPUTempe endp
;#########################################################
pmuWait4IBE proc
PUSH AX
PW4IBE:
IN AL, 06CH ; Read PMU status
TEST AL, 2 ; Is Input Buffer Empty?
JNZ PW4IBE ; Jmp if no
POP AX
ret
pmuWait4IBE endp;END OF PMUWAIT4IBE
;#########################################################
pmuWait4OBF proc
PUSH AX
PW4OBF:
IN AL, 06CH ; Read PMU status
TEST AL, 1 ; Is Output Buffer Full?
JZ PW4OBF ; Jmp if no
POP AX
ret
pmuWait4OBF endp;END OF PMUWAIT4OBF
mov ah,4ch
int 21h
code ends
end start
#3
自己再写个调用的就可以了。
#4
楼上的大哥,用记事本吗?能介绍下流程吗?
#5
谢谢,我需要步骤啊,我不会玩汇编,但我目前有个Masm6.15,想用它来编译这个东东,请指点步骤
#6
晕,网络上的教程太多了。
实在不行,你直接把3#的代码直接拷到记事本。
存成test.asm
保存路径为你安装到masm615/bin下。
然后masm test.asm
link test.obj
实在不行,你直接把3#的代码直接拷到记事本。
存成test.asm
保存路径为你安装到masm615/bin下。
然后masm test.asm
link test.obj
#7
好好好,试试去
#8
不用这么麻烦直接:ML TEST.ASM就直接可以汇编了.
如果需要列表文件:ML /Fl /sG TEST.ASM.
如果需要列表文件:ML /Fl /sG TEST.ASM.
#9
这只是代码片段,需要补充完整,至少要有段定义。你想编译得到什么文件,做什么用?
#10
你是说这不是完整的,我只有这么多了,就想看个运行的结果,因为有人告诉我这段代码可以得到CPU温度
所以我到这来请教高手,我用什么编译都不知道,更不用说想得到什么文件了,能不能教我怎么样得到结果,谢谢了
#11
估计得不到你想要的结果,除非找到与写这个代码的人的相同的平台和环境
#12
这样啊,那不是白费,哎,那你看这段代码的意义何在,它能做什么呢?
谢谢
#13
上面的代码只是几个函数,完整的程序需要有段定义、程序入口点,通常还要有输入/输出(例如取到结果后显示出来)。
#14
对,直接地 ML 就可以了。
ML 是无敌的。无论床上还是桌面上……
#15
这个问题解决了没?这段代码根本就是不对的,
#16
试了,汇编没通过。
#17
这个程序是干什么的?
#18
IO得不到
#1
为什么没人来回答,急啊
#2
汇编可以通过:
data segment
PMU_SC equ 6Ch ;命令端口
PMU_DATA equ 68h ;数据端口
RD_EC_SMI equ 80h ;读寄存器命令
POLLING_DATA equ 0E7h ;CPU温度寄存器号
data ends
code segment
assume cs:code,ds:data
start:
GetCPUTempe proc
pushf
cli
mov dx,PMU_SC
mov al,RD_EC_SMI
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al ; 将读寄存器命令放到命令端口中。
mov dx,PMU_DATA
mov al,POLLING_DATA
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al ;将CPU温度寄存器号 放到数据端口中
mov dx,PMU_DATA
call pmuWait4OBF ;Must have 输出缓冲为满吗? 有数据则可以读了
in al,dx ;从数据端口中读入数据
sti
popf
GetCPUTempe endp
;#########################################################
pmuWait4IBE proc
PUSH AX
PW4IBE:
IN AL, 06CH ; Read PMU status
TEST AL, 2 ; Is Input Buffer Empty?
JNZ PW4IBE ; Jmp if no
POP AX
ret
pmuWait4IBE endp;END OF PMUWAIT4IBE
;#########################################################
pmuWait4OBF proc
PUSH AX
PW4OBF:
IN AL, 06CH ; Read PMU status
TEST AL, 1 ; Is Output Buffer Full?
JZ PW4OBF ; Jmp if no
POP AX
ret
pmuWait4OBF endp;END OF PMUWAIT4OBF
mov ah,4ch
int 21h
code ends
end start
data segment
PMU_SC equ 6Ch ;命令端口
PMU_DATA equ 68h ;数据端口
RD_EC_SMI equ 80h ;读寄存器命令
POLLING_DATA equ 0E7h ;CPU温度寄存器号
data ends
code segment
assume cs:code,ds:data
start:
GetCPUTempe proc
pushf
cli
mov dx,PMU_SC
mov al,RD_EC_SMI
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al ; 将读寄存器命令放到命令端口中。
mov dx,PMU_DATA
mov al,POLLING_DATA
call pmuWait4IBE ;Must have 输入缓冲为空吗,为空可以放命令了
out dx,al ;将CPU温度寄存器号 放到数据端口中
mov dx,PMU_DATA
call pmuWait4OBF ;Must have 输出缓冲为满吗? 有数据则可以读了
in al,dx ;从数据端口中读入数据
sti
popf
GetCPUTempe endp
;#########################################################
pmuWait4IBE proc
PUSH AX
PW4IBE:
IN AL, 06CH ; Read PMU status
TEST AL, 2 ; Is Input Buffer Empty?
JNZ PW4IBE ; Jmp if no
POP AX
ret
pmuWait4IBE endp;END OF PMUWAIT4IBE
;#########################################################
pmuWait4OBF proc
PUSH AX
PW4OBF:
IN AL, 06CH ; Read PMU status
TEST AL, 1 ; Is Output Buffer Full?
JZ PW4OBF ; Jmp if no
POP AX
ret
pmuWait4OBF endp;END OF PMUWAIT4OBF
mov ah,4ch
int 21h
code ends
end start
#3
自己再写个调用的就可以了。
#4
楼上的大哥,用记事本吗?能介绍下流程吗?
#5
谢谢,我需要步骤啊,我不会玩汇编,但我目前有个Masm6.15,想用它来编译这个东东,请指点步骤
#6
晕,网络上的教程太多了。
实在不行,你直接把3#的代码直接拷到记事本。
存成test.asm
保存路径为你安装到masm615/bin下。
然后masm test.asm
link test.obj
实在不行,你直接把3#的代码直接拷到记事本。
存成test.asm
保存路径为你安装到masm615/bin下。
然后masm test.asm
link test.obj
#7
好好好,试试去
#8
不用这么麻烦直接:ML TEST.ASM就直接可以汇编了.
如果需要列表文件:ML /Fl /sG TEST.ASM.
如果需要列表文件:ML /Fl /sG TEST.ASM.
#9
这只是代码片段,需要补充完整,至少要有段定义。你想编译得到什么文件,做什么用?
#10
你是说这不是完整的,我只有这么多了,就想看个运行的结果,因为有人告诉我这段代码可以得到CPU温度
所以我到这来请教高手,我用什么编译都不知道,更不用说想得到什么文件了,能不能教我怎么样得到结果,谢谢了
#11
估计得不到你想要的结果,除非找到与写这个代码的人的相同的平台和环境
#12
这样啊,那不是白费,哎,那你看这段代码的意义何在,它能做什么呢?
谢谢
#13
上面的代码只是几个函数,完整的程序需要有段定义、程序入口点,通常还要有输入/输出(例如取到结果后显示出来)。
#14
对,直接地 ML 就可以了。
ML 是无敌的。无论床上还是桌面上……
#15
这个问题解决了没?这段代码根本就是不对的,
#16
试了,汇编没通过。
#17
这个程序是干什么的?
#18
IO得不到