| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1435 人关注过本帖
标题:C语言嵌入汇编
只看楼主 加入收藏
Karl168
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2007-9-23
收藏
 问题点数:0 回复次数:9 
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
雨中飛燕
Rank: 1
等 级:新手上路
帖 子:765
专家分:0
注 册:2007-10-13
收藏
得分:0 
那你就扔掉TC啊

" border="0" />[color=white]
2008-04-23 21:16
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
我的c51和x86早就还给老师了...看来还要看看..呵呵

学习需要安静。。海盗要重新来过。。
2008-04-23 21:21
VxWorks
Rank: 3Rank: 3
来 自:WindRiver
等 级:论坛游民
威 望:6
帖 子:859
专家分:68
注 册:2007-11-24
收藏
得分:0 
建议换用vc系列,支持从8086到奔腾系列处理器。
内联汇编的语法是__asm{}

为了防止世界被破坏,为了守护世界的和平,贯彻爱与真实的邪恶,可爱又迷人的反派角色,VxWorks!
Don't ask me any question.I'm just here to buy soy sauce.
2008-04-23 23:21
yuki
Rank: 2
等 级:新手上路
威 望:5
帖 子:508
专家分:0
注 册:2005-2-4
收藏
得分:0 
32位的编译器支持扩展寄存器eax,ebx,ecx等。

我们都在命运湖上荡舟划桨,波浪起伏使我们无法逃离孤行;如果我们迷失方向,波浪将指引我们穿过另一天曙光
2008-04-23 23:25
Karl168
Rank: 1
等 级:新手上路
帖 子:61
专家分:0
注 册:2007-9-23
收藏
得分:0 
那VC能直接访问32位内存地址吗?好像汇编中的in 和out只支持16位的
2008-04-24 22:35
sunkaidong
Rank: 4
来 自:南京师范大学
等 级:贵宾
威 望:12
帖 子:4496
专家分:141
注 册:2006-12-28
收藏
得分:0 
我运行了一下..剔除in和out可以运行(除了变量没声明,asm要_asm)

学习需要安静。。海盗要重新来过。。
2008-04-24 23:05
neverTheSame
Rank: 3Rank: 3
来 自:江西农业大学
等 级:新手上路
威 望:9
帖 子:1511
专家分:0
注 册:2006-11-24
收藏
得分:0 
楼主可用中断函数来完成对硬件的操作:
__int__
geninterrupt
int86
int86x
intdos
intdosx
intr

wap酷禾网(http://wap.),提供免费的、优质的、快捷的wap资源下载服务。
2008-04-25 01:39
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 4# 的帖子
现在的 64位机还能支持吗
2008-04-25 10:20
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.016844 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved