收录日期:2018/10/21 01:30:55 时间:2016/05/22 08:22:10 标签:C语言
我抄了一些c语言,是32位的,在vc6.0下能编译通过,但就是不能生成exe文件,
老是包错,说什么连接不上。
_asm关键字,把汇编代码插入到_asm{}中间
例如:
#include <stdio.h>

char format[] = "%s %s\n";
char hello[] = "Hello";
char world[] = "world";
void main( void )
{
   __asm
   {
      mov  eax, offset world
      push eax
      mov  eax, offset hello
      push eax
      mov  eax, offset format
      push eax
      call printf
      //clean up the stack so that main can exit cleanly
      //use the unused register ebx to do the cleanup
      pop  ebx
      pop  ebx
      pop  ebx
   }
}
望下面的文章对你有所帮助:


我在写定时提醒 时碰到一个问题:怎么发声?我开始是用 32 位 Windows 的 API 函数 MessageBeep( -1 ); 那声音又小又难听。原来在 16 位的 Windows API 中有的一套 PlaySound 的函数在 32 位 Windows 中又取消了, DOS 下的 Sound 函数更是早就不能用了。  

幸好我对硬件还算了解,知道 PC Speaker 的声音是通过系统中的定时计数芯片 8253/8254 产生的,只要通过硬件端口访问芯片就可以产生想要的声音了。 问题在于 Windows 是工作在保护模式下,大多数硬件端口都要在特权级0(PL0, 这是搞硬件的人的说法,后来我才知道在搞 OS 和 Driver 的人中是叫 Ring 0 的, 这才比较正确,因为如果不是 Intel 的 CPU 可能就不叫 PL 了)中, 即操作系统核心态中,才可以访问(比如硬盘口,访问时是不会出错,但结果不正确), 这也就意味着要写成驱动程序的形式,天啊! VxD 和 WDM 我都不会,怎么办? 事实上没有这么困难,像 PC Speaker 这种无伤大体的端口, Windows 是不保护的, 即在用户态下也可以正常访问。  

现在还有一个问题就是用什么语句访问端口? DOS 中 C 语言里的那几个端口操作函数在 Windows 中都取消了,只好用汇编。我开始是用 ASM 语句插入汇编代码,结果发现 BCB 在编译时碰到 ASM 时会把 BCB 文件编译成一个巨大的 ASM 文件, 再重新启动汇编程序汇编,速度太慢。最后采用了我在 DOS 编程时常用的方法, 做一个单独的 ASM 文件加入工程文件中。  

下面是两个用于发声的函数,最前面声明了两个外部 C 调用形式的函数, 是两个用汇编写的字节端口输入/输出函数,注意:在 C++ 中一定要注意外部函数应为 C 调用形式。程序中多处强制类型转换是为了不出现警告,我对程序一向要求 Error/Warning/Hint 全为 0。  


extern "C" { 
Byte InPortB( int aPort ); 
void OutPortB( int aPort, Byte aValue ); 


void __fastcall Sound( int aFreq ) 

if ( ( aFreq >= 20 ) && ( aFreq <= 20000 ) ) 

aFreq = 1193181 / aFreq; 
Byte b = InPortB( 0x61 ); 
if ( ( b & 3 ) == 0 ) 

OutPortB( 0x61, Byte( b | 3 ) ); 
OutPortB( 0x43, 0xb6 ); 

OutPortB( 0x42, ( Byte )aFreq ); 
OutPortB( 0x42, ( Byte )( aFreq >> 8 ) ); 



void __fastcall NoSound( void ) 

Byte b = Byte( InPortB( 0x61 ) & 0xfc ); 
OutPortB( 0x61, b ); 



下面是两个端口 I/O 的函数的汇编源程序,即定时提醒(Alarm)中的 IOPortB.asm 文件的全部内容,是在 BCB 产生的 ASM 文件基础上作了一点点的优化。 注意:  
1 、最前面的 .386p 必不可少,指定用 32 位保护模式,至于 modal flat 我也不太明白是 What ,跟 16 位时的 tiny, small... 不同,大概是指用 32 位保护模式的平坦地址间模式吧;  
2 、在 32 位保护模式中, CS/IP 为 32 位,参数在栈中的位置与 16 位时不同;  
3 、最后的 public 也不可少,前缀的下划线也是必须的,另外记得用大小写敏感方式汇编。  


.386p 
model flat 
_TEXT segment dword public use32 ''CODE'' 

_InPortB proc near 
push ebp 
mov ebp, esp 
mov dx, word ptr [ebp + 8] 
in al, dx 
pop ebp 
ret 
_InPortB endp 

_OutPortB proc near 
push ebp 
mov ebp, esp 
mov dx, word ptr [ebp + 8] 
mov al, byte ptr [ebp + 12] 
out dx, al 
pop ebp 
ret 
_OutPortB endp 

public _InPortB 
public _OutPortB 

_TEXT ends 

end 


注意:此法在 Windows NT 上行不通,因为 Windows NT 保护了所有的端口,必须用 WDM,连 VxD 也不行,它只用于 Windows 95 ,在 Windows 98 中也可以用,但 Windows NT 和 Windows 2000 都不支持。
还有一些“内联汇编基础知识”你可以看看:
http://www.vckbase.com/document/viewdoc.asp?id=463
mark 一下
抄了一些c语言?
我感觉你问得好像不是asm的,而是一些纯粹的c程序而已,如果是这样,那就是代码的错误了

生成执行文件包括两个过程,第一是编译,第二是连接,你的程序是连接出了问题,不妨检查一下源程序,看各个文件之间包含是否正确,
还有可能是你的vc装的有问题,试一下一个简单的hello,world程序,如果仍然有问题的话,就是vc有问题了!
把源程序拿来看看。
对,把代码和错误拷出来,让大家看看,应该不是什么大问题。
对,把问题说得具体一点。
在vc下当然可以做c语言程序了
你创建一个  win32 console application 你就可以编写了
编译开关。
/Tp或者 /Tc。我不太记得了。
查一下应该可以。
源码是这样的
Simplewin.h
   LRESULT CALLBACK MainWndProc(HWND,UINT,WPARAM,LPARAM);

 BOOL InitApplication(HINSTANCE);
 BOOL InitInstance(HINSTANCE,int);

 char *hello="窗口外的世界很精彩,窗口内的天地也很奇妙";



 Simplewin.c
    #include <windows.h>
#include <string.h>
#include "Simplewin.h"

HINSTANCE hInst;
HWND hWndMain;

int APIENTRY WinMian(
    HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR     lpCmdLine,
    int       nCmdShow)
{
  MSG msg;
  if(!InitApplication(hInstance))
   return (FALSE);

  if(!InitInstance(hInstance,nCmdShow))
   return (FALSE);

  while(GetMessage(&msg,
  NULL,
  0,
  0))
  {
  TranslateMessage(&msg);
  DisPatchMessage(&msg);
  }

  return (msg.wParam);
}



BOOL InitApplication(HINSTANCE hInstance)
{
WNDCLASS wcSimpwin;

wcSimpwin.style=0;
wcSimpwin.lpfnWndProc=(WNDPROC)MainWndProc;
wcSimpwin.cbClsExtra=0;
wcSimpwin.cbWndExtra=0;
wcSimpwin.hInstance=hInstance;
wcSimpwin.hIcon=LoadIcon(NULL,IDI_APPLICATION);
wcSimpwin.hCursor=LoadCursor(NULL,IDC_ARROW);
wcSimpwin.hbrBackground=GetStockObject(WHITE_BRUSH);
wcSimpwin.lpszMenuName=NULL;
wcSimpwin.lpszClassName="SimplewinWClass";

return (RegisterClass(&wcSimpwin));
}


BOOL InitInstance(
  HINSTANCE hInstance,
  int       nCmdShow)
{
hInst=hInstance;

hWndMain=CreateWindow(
"SimpwinWClass",
"我的窗口",
WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,CW_USEDEFAULT,
CW_USEDEFAULT,CW_USEDEFAULT,
NULL,NULL,hInstance,NULL);

if(!hWndMain)
return (FALSE);

ShowWindow(hWndMain,nCmdShow);
UpdateWindow(hWndMain);

return (TRUE);
}



LRESULT CALLBACK MainWndProc(
HWND hWnd,
UINT message,
WPARAM wParam,
LPARAM lParam)
{
HDC hdc;
PAINTSTRUCT ps;

switch(message)
{
case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
TextOut(hdc,20,10,hello,lstrlen(hello));
EndPaint(hWnd,&ps);
break;

case WM_DESTROY:
PostQuitMessage(0);
break;

    default:
 return(DefWindowProc(hWnd,message,wParam,lParam));
}

return (0);
}



   编译成exe的错误信息:
    Linking...
Simplewin.obj : error LNK2001: unresolved external symbol _DisPatchMessage
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/Simplewin.exe : fatal error LNK1120: 2 unresolved externals
Error executing link.exe.

Simplewin.exe - 3 error(s), 0 warning(s)
是不是:
1.两个文件.h.cpp没放在*win32 console 工程里面?
2.看看头文件设置路径有没有错?(自动安装应该没错的啊?)
首先你的程序里面原来就有三个错误,一个是DisPatchMessage应该是DispatchMessage才对,第二个是在对hbrBackground进行赋值的时候右值应该进行HBRUSH转换.最后一个是WinMian应该改为WinMain.
摆脱,这是什么时候的程序
不是编译器的问题,这段程序用的windows.h肯定与vc6.0的有较大差距。
console application
大哥,改好了吗?改好了要记得结帖呀.

水晶报表超怪问题,高手过来看看。 『急』linux该如何学?---请高手指点 asp.net环境下html不能提交给asp处理 求 skype for linux fc6 下载地址 C#.NET进销存 大家都过来看看这个问题。。。怎么解决? 如何能够快速索引下标啊? 提交后出现internal error 您好,用java怎样将word,excl转换成txt的文件 怎么让线程不抢占资源呀。。。谢谢 劳驾各位帮忙,急急急!!! 请问一个类似于GOOLE地图的问题,小弟现在什么分,但一定全部相赠 关于NOIP题目加分二叉树的C程序 wml 如何包含中文文件而不显示乱码 如何删除控制台程序中输出的字符??? ASP代码怎么看不懂啊,跪求高手帮忙解释... SQLServer2005无法启动SSIS的问题,急!!(100分) 求一个档案管理系统的jsp源码,谢谢! 怎样用STL中的list建立一个有向加权图 为何将frame的scrolling设为no,frame还能拖动 如何判断空字符串/? 请求帮助!!高手们帮帮忙! Hibernant中save or update的问题 数据类型 这些标点符号[]\\;\',./的虚键代码是什么,MSDN里怎么查不到? 如何用GHOST在多张CD-ROM中备份系统?? 运行多个添加相同控件的ie时出错。 100分求一个网上店铺系统免费代码 请大家帮忙,后台形成left菜单问题,现在是只要登陆,ie跟jbuider进程就一直吃内存,吃尽为止 关于视频会议电视墙服务器,求助各位前辈!