有一段汇编代码,执行的是取得CPU的温度,如下:
PMU_SC equ 6Ch
PMU_DATA equ 68h
RD_EC_SMI equ 80h
POLLING_DATA equ 0E7h
;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 mov dx,PMU_DATA
call pmuWait4OBF ;Must have
in al,dx ;Get Temperature
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
;#########################################################有winio例程一段,如下,问怎么样把上面的汇编嵌入下面的程序中,以达到在程序中取得CPU温度的结果:
#include <windows.h>
#include <stdio.h>
#include "winio.h"void main()
{
  DWORD dwPortVal;
  DWORD dwMemVal;
  bool bResult;
  HANDLE hPhysicalMemory;
  PBYTE pbLinAddr;  // Call InitializeWinIo to initialize the WinIo library.  bResult = InitializeWinIo();  if (bResult)
  {
    // Under Windows NT/2000/XP, after calling InitializeWinIo,
    // you can call _inp/_outp instead of using GetPortVal/SetPortVal    GetPortVal(0x378, &dwPortVal, 4);    SetPortVal(0x378, 10, 4);    // Map physical addresses 0xA0000 - 0xAFFFF into the linear address space
    // of the application. The value returned from the call to MapPhysToLin is
    // a linear address corresponding to physical address 0xA0000. In case of
    // an error, the return value is NULL.    pbLinAddr = MapPhysToLin((PBYTE)0xA0000, 65536, &hPhysicalMemory);    if (pbLinAddr)
    {
      // Now we can use pbLinAddr to access physical address 0xA0000      *pbLinAddr = 10;      // When you're done with pbLinAddr, call UnmapPhysicalMemory      UnmapPhysicalMemory(hPhysicalMemory, pbLinAddr);
    }    // Instead of using MapPhysToLin, we can use GetPhysLong/SetPhysLong    GetPhysLong((PBYTE)0xA0000, &dwMemVal);    SetPhysLong((PBYTE)0xA0000, 10);    // When you're done using WinIo, call ShutdownWinIo    ShutdownWinIo();
  }
  else
  {
    printf("Error during initialization of WinIo.\n");
    exit(1);
  }
}