| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1435 人关注过本帖
标题:C语言嵌入汇编
取消只看楼主 加入收藏
Karl168
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2007-9-23
收藏
 问题点数:0 回复次数:2 
C语言嵌入汇编
毫无疑问,Tubo C是支持嵌入汇编的,但不支持386以上的指令及寄存器.例如
#include <stdio.h>
#include <conio.h>
#include <dos.h>
#define OUTPORT 0x0CF8
#define INPORT 0x0CFC
typedef unsigned long ULONG;
viod main()
{
     ULONG inport_value;

    asm {
        .386
        mov eax,outport_value
        mov dx,OUTPORT
        out dx,eax
        mov dx,INPORT
        in eax,dx
        mov inport_value,eax
    }
    printf("%#x",inport_value);
}
编译器无法识别EAX.

希望能和大家交流一下,看能否解决这个问题.
目前我在学习编写个程序去访问PCI设备,这要用到32位的内存地址,目前还不知道如何访问呢,不知道有没有人对这方面比较有兴趣啊,很想有个人来交流.呵呵~~~
谢谢各位啦
搜索更多相关主题的帖子: C语言 汇编 
2008-04-23 20:59
Karl168
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2007-9-23
收藏
得分:0 
那VC能直接访问32位内存地址吗?好像汇编中的in 和out只支持16位的
2008-04-24 22:35
Karl168
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2007-9-23
收藏
得分:0 
下面这段小程序是我写的,用来访问PCI 设备中HDA 控制器的一些寄存器内的值.用turb C编译已经OK了,但用VC却不行啊.
  // Note:Your choice is C++ IDE
#include "iostream.h"
#include <stdio.h>
#include <conio.h>
typedef unsigned char BYTE;
typedef unsigned int WORD;
typedef unsigned long DWORD;
#define PCI_CONFIG_ADDRESS      0xCF8
#define PCI_CONFIG_DATA         0xCFC
#define HDA_address            0x8000D804
#define AUDIO_ADDR1            0x8000D810
//#define AUDIO_ADDR2            0x8000D811
//#define AUDIO_ADDR3            0x8000D812
//#define AUDIO_ADDR4            0x8000D813
#define HDA                    0x8000D800
/* 读32位端口 */
DWORD inpd(int portid)
{ DWORD dwRet;
asm mov dx, portid;
asm lea bx, dwRet;
__emit__
(  0x66,0x50, // push EAX  
   0x66,0xED, // in EAX,DX
   0x66,0x89,0x07, // mov [BX],EAX
   0x66,0x58); // pop EAX
return dwRet;
}
/* 写32位端口 */
void outpd(int portid, DWORD dwVal)
{
asm mov dx, portid;
asm lea bx, dwVal;
 __emit__
(
  0x66,0x50, // push EAX  
  0x66,0x8B,0x07, // mov EAX,[BX]
  0x66,0xEF, // out DX,EAX  
  0x66,0x58); // pop EAX
return;
}

void main()
{
 DWORD HDA_04;
 DWORD HDA_V;
 DWORD  AUDIO_A;
 outpd(PCI_CONFIG_ADDRESS,HDA_address);
 HDA_04=inpd(PCI_CONFIG_DATA);
 //get address1
 outpd(PCI_CONFIG_ADDRESS,AUDIO_ADDR1);
 AUDIO_A=inpd(PCI_CONFIG_DATA);
 //get address2
 //outpd(PCI_CONFIG_ADDRESS,AUDIO_ADDR2);
 //AUDIO_2=inpd(PCI_CONFIG_DATA);
 //get address3
 //outpd(PCI_CONFIG_ADDRESS,AUDIO_ADDR3);
 //AUDIO_3=inpd(PCI_CONFIG_DATA);
 //get address4
 outpd(PCI_CONFIG_ADDRESS,HDA);
 HDA_V=inpd(PCI_CONFIG_DATA);
 printf("The HDA_04 value=%#x%x \n",(WORD)HDA_04,HDA_04>>16);
 printf("THE AUDIO BASE ADDRESS IS:%#x%x \n",(WORD)AUDIO_A,AUDIO_A>>16);
 printf("%#x%x",(WORD)HDA_V,HDA_V>>16);
   
}
2008-04-25 21:01
快速回复:C语言嵌入汇编
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.036061 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved