使用vs2010
使用mfc工程 
加入了asm文件
配置应该没问题,因为单独编译asm文件能成功但是把函数声明加入到dlg 的.cpp文件中后就提示错误
>WDT.obj : fatal error LNK1190: 找到无效的链接地址信息,请键入 0x0001WDT.asm如下.MODEL SMALL  
.CODE  WDTMain PROC NEAR 
CALL EnterXXXXX
...........
CALL ExitXXXXX
MOV AH,4Ch  
INT 21hEnterXXXXX NEAR  
.....
EnterXXXXX  ENDP   MOV DX,02Eh  
Cfg_Port DB 085h,051h,035h,015h  
DW 08Eh,05Fh  
 
WDTMain endp
end我在dlg的.cpp文件中 
extern "C" int WDTMain();BOOL CTestDlg::OnInitDialog()
{
   .......
   WDTMain();
   .......
}编译失败:
1>  Assembling [Inputs]...
1>WDT.obj : fatal error LNK1190: 找到无效的链接地址信息,请键入 0x0001
========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========操作系统是xp sp3请各位帮忙,先谢谢了!另附:这个问题问这个版块是否恰当?

解决方案 »

  1.   

    没有在Windows下把汇编的obj和C/C++的obj一起链接过我只知道C语言的函数在编译时好像会在前面被加个下划线,还有,你的
    MOV AH,4Ch   
    INT 21h
    在Windows下显然不行,这个是DOS中断
      

  2.   

    这是个看门狗的程序
    厂商手持写的就是MODEL 
    换成FLAT asm编译失败谢谢
      

  3.   

    MOV AH,4Ch  
    INT 21h去掉这两行也不行 目前的错误感觉是在CPP中声明函数的问题,不知道该如何声明。谢谢
      

  4.   

    找到无效的链接地址信息,请键入 0x0001
    这个错误可能是无法找到asm 的函数比如我在cpp中任意 声明一个extern "C" int DoWork();
    在代码中调用DoWork 就会提示“找到无效的链接地址信息,请键入 0x0001”
    因为没有定义DoWork的实现可是asm文件也没有.h之类的头文件啊,在cpp中该如何使用呢?
    郁闷啊~~~
      

  5.   


    我不是说去掉这两行就行了,这两行不影响编译的,只是执行到了的话可能会出问题。你把你asm里面的WDTMain改成_WDTMain试试
      

  6.   

    找到无效的链接地址信息,请键入 0x0001
    这个错误可能是无法找到asm 的函数
      

  7.   

    怎么让CPP识别到asm 的函数啊
      

  8.   

    最新线索!
    发现了关键点问题
    ASM代码中的Cfg_Port DB 087h,001h,055h,055h  WDTMain PROC
    CALL EnterXXXXX
    ...........
    CALL ExitXXXXX
    MOV AH,4Ch   
    INT 21hEnterXXXXX NEAR   
    MOV SI,WORD PTR CS:[Offset Cfg_Port]   
    .....
    EnterXXXXX ENDP   MOV DX,02Eh   
    Cfg_Port DB 085h,051h,035h,015h   
    DW 08Eh,05Fh   
     
    WDTMain endp
    end汇编代码中一些子过程会使用Cfg_Port DB 085h,051h,035h,015h 
    如果把所以涉及Cfg_Port的代码都注释掉,工程就能编译成功!请问为什么啊
      

  9.   

    Cfg_Port是一个常量的地址,因为你没有使用FLAT模式,所以无法在Win32下编译
      

  10.   

    MOV SI,WORD PTR CS:[Offset Cfg_Port]
    这句可以改成
    MOV SI,0187H
      

  11.   

    我如果改成下面这样
    .model   FLAT,   stdcall 
    .code 
    WDTMain PROC  
    ...编译ASM就会提示异常:
    1>WDT.asm(43): error A2155: cannot use 16-bit register with a 32-bit address
    1>WDT.asm(38): error A2022: instruction operands must be the same size
    1>C:\Program Files\MSBuild\Microsoft.Cpp\v4.0\BuildCustomizations\masm.targets(49,5): error MSB3721: 命令“ml.exe /c /nologo /Zi /Fo"Debug\WDT.obj" /W3 /errorReport:prompt  /TaWDT.asm”已退出,返回代码为 1。
    ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========感谢!
      

  12.   


    请问这是怎么计算的
    N年没用汇编了 看不懂了MOV SI,WORD PTR CS:[Offset Cfg_Port]   MOV DX,WORD PTR CS:[Cfg_Port+04h]MOV DX,WORD PTR CS:[Cfg_Port+06h]  该怎么计算?
      

  13.   

    你这个asm很明显是dos程序。在win32下要么改写成驱动的形式。才能in ,out
      

  14.   

    虽然没看到你完整的汇编代码。但是我看到有cfg_port肯定有in,out
      

  15.   

    WORD PTR CS:[Offset Cfg_Port]
    就是采用寻址方式,表示Cfg_Port处的两个字节(WORD),这两个字节是087h,001h,由于x86是小端,所以表示的数就是0187H。由于Cfg_Port处的数据是常数,所以可以改为直接指定立即数。Cfg_Port DB 085h,051h,035h,015h   
    DW 08Eh,05Fh
    WORD PTR CS:[Cfg_Port+04h]指向的就是08EH
    MOV DX,WORD PTR CS:[Cfg_Port+04h]
    就相当于
    MOV DX,08EH
    DB是字节定义,DW是WORD(字)定义,DD是DWORD(双字)定义
      

  16.   


    就像楼上有人说的一样,纯DOS的汇编无法在Win32下使用的,就算编译过了也不代表能用。
      

  17.   

    咋看出是DOS的啊
    能改成windows的吗
      

  18.   

    win32是保护模式。不允许你随便操作硬件的。找厂商要win32驱动吧
      

  19.   

    MOV AH,4Ch
    INT 21h
    这两句就是程序结束返回DOS命令行的调用至于能否改成Windows的,楼上已经回答了