收录日期:2018/12/12 11:34:31 时间: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
大哥,改好了吗?改好了要记得结帖呀.

请大家帮我改下代码,用VS2008做的一个通讯录管理系统,由于是初学者望大家帮帮忙! 有点挑战性,采集Google AdWords KeywordToolExternal 关键字工具网页数据 导入excel表格到access后产生的问题? java问题 关于创建数据库的问题 U盘 XMPP是个啥东东 把Excel导入到数据库问题 vs2005代码段编辑器在哪下载? 查询url文件流 下面红色name是什么意思啊 因为想从事嵌入式开发,所以想从单片机开始,弄懂其原理,请大虾推荐下教材和一些资料,谢谢..! struts2疑似让失效的奇怪问题 jsp页面中通过request.setAttribute方法设置的值如何传递到action中 【求助】能否将oracle的表空间分成多个区吗? 如何在xp下,对lsass注入DLL,或单开一个远程线程 求正则表达式,分不够再加! 请问这样的登陆程序有没漏洞可攻击 PB中PDF控件如何显示文档啊 请问如果用互联星空上网的话,虚拟机上的linux可以上网么 word 宏自定义工具栏 powerdesigner12.5概念模型转换为物理模型 所有除主键字段外都变为外键(急!急!急!)) 关于IWebBrowser2和MS Active Accessibility接口问题 比较复杂的位操作(位交换,及位取反) 关于Eclipse 3.5 for javaEE(伽利略)的问题 J2EE的主要作用,功能? 怎样自动退出控制台应用程序(C语言) 请教一个关于数组的问题~~~~~来了有份 如何停止输出页面 急,??? 打印问题,高手帮忙!