关于VC嵌入asm文件的问题 fatal error LNK1190

ghost5216 2011-06-30 04:29:31
使用vs2010
使用mfc工程
加入了asm文件
配置应该没问题,因为单独编译asm文件能成功

但是把函数声明加入到dlg 的.cpp文件中后就提示错误
>WDT.obj : fatal error LNK1190: 找到无效的链接地址信息,请键入 0x0001

WDT.asm如下

.MODEL SMALL
.CODE

WDTMain PROC NEAR
CALL EnterXXXXX
...........
CALL ExitXXXXX
MOV AH,4Ch
INT 21h

EnterXXXXX 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

请各位帮忙,先谢谢了!

另附:这个问题问这个版块是否恰当?
...全文
510 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
果如二位所言
编译通过了也不好使
还是消停的找厂家吧
kyotrue 2011-07-01
  • 打赏
  • 举报
回复
MOV AH,4Ch
INT 21h
这两句就是程序结束返回DOS命令行的调用

至于能否改成Windows的,楼上已经回答了
  • 打赏
  • 举报
回复
win32是保护模式。不允许你随便操作硬件的。找厂商要win32驱动吧
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 kyotrue 的回复:]
引用 18 楼 ghost5216 的回复:
引用 16 楼 kylixfire 的回复:
虽然没看到你完整的汇编代码。但是我看到有cfg_port肯定有in,out

确实有


就像楼上有人说的一样,纯DOS的汇编无法在Win32下使用的,就算编译过了也不代表能用。
[/Quote]
咋看出是DOS的啊
能改成windows的吗
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 kyotrue 的回复:]

就像楼上有人说的一样,纯DOS的汇编无法在Win32下使用的,就算编译过了也不代表能用。
[/Quote]
先试试看了
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 kyotrue 的回复:]
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:[……
[/Quote]
非常感谢

编译通过

kyotrue 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 ghost5216 的回复:]
引用 16 楼 kylixfire 的回复:
虽然没看到你完整的汇编代码。但是我看到有cfg_port肯定有in,out

确实有
[/Quote]

就像楼上有人说的一样,纯DOS的汇编无法在Win32下使用的,就算编译过了也不代表能用。
kyotrue 2011-07-01
  • 打赏
  • 举报
回复
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(双字)定义
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 kylixfire 的回复:]
虽然没看到你完整的汇编代码。但是我看到有cfg_port肯定有in,out
[/Quote]
确实有
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 kylixfire 的回复:]
你这个asm很明显是dos程序。在win32下要么改写成驱动的形式。才能in ,out
[/Quote]
怎么看出来的呢
  • 打赏
  • 举报
回复
虽然没看到你完整的汇编代码。但是我看到有cfg_port肯定有in,out
  • 打赏
  • 举报
回复
你这个asm很明显是dos程序。在win32下要么改写成驱动的形式。才能in ,out
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 kyotrue 的回复:]
MOV SI,WORD PTR CS:[Offset Cfg_Port]
这句可以改成
MOV SI,0187H
[/Quote]

请问这是怎么计算的
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]

该怎么计算?
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 kyotrue 的回复:]
Cfg_Port是一个常量的地址,因为你没有使用FLAT模式,所以无法在Win32下编译
[/Quote]
我如果改成下面这样
.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 个 ==========

感谢!
kyotrue 2011-07-01
  • 打赏
  • 举报
回复
MOV SI,WORD PTR CS:[Offset Cfg_Port]
这句可以改成
MOV SI,0187H
kyotrue 2011-07-01
  • 打赏
  • 举报
回复
Cfg_Port是一个常量的地址,因为你没有使用FLAT模式,所以无法在Win32下编译
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
最新线索!
发现了关键点问题
ASM代码中的Cfg_Port DB 087h,001h,055h,055h

WDTMain PROC
CALL EnterXXXXX
...........
CALL ExitXXXXX
MOV AH,4Ch
INT 21h

EnterXXXXX 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的代码都注释掉,工程就能编译成功!

请问为什么啊
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 kyotrue 的回复:]
引用 4 楼 ghost5216 的回复:
引用 2 楼 kyotrue 的回复:
没有在Windows下把汇编的obj和C/C++的obj一起链接过。。。

我只知道C语言的函数在编译时好像会在前面被加个下划线,还有,你的
MOV AH,4Ch
INT 21h
在Windows下显然不行,这个是DOS中断

MOV AH,4Ch
INT 21h

去掉这两行也不行

……
[/Quote]
一直就是找到无效的链接地址信息,请键入 0x0001
唉......
ghost5216 2011-07-01
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 wyx100 的回复:]
找到无效的链接地址信息,请键入 0x0001
这个错误可能是无法找到asm 的函数
[/Quote]
怎么让CPP识别到asm 的函数啊
wyx100 2011-06-30
  • 打赏
  • 举报
回复
找到无效的链接地址信息,请键入 0x0001
这个错误可能是无法找到asm 的函数
加载更多回复(6)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧