使用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请各位帮忙,先谢谢了!另附:这个问题问这个版块是否恰当?
使用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请各位帮忙,先谢谢了!另附:这个问题问这个版块是否恰当?
MOV AH,4Ch
INT 21h
在Windows下显然不行,这个是DOS中断
厂商手持写的就是MODEL
换成FLAT asm编译失败谢谢
INT 21h去掉这两行也不行 目前的错误感觉是在CPP中声明函数的问题,不知道该如何声明。谢谢
这个错误可能是无法找到asm 的函数比如我在cpp中任意 声明一个extern "C" int DoWork();
在代码中调用DoWork 就会提示“找到无效的链接地址信息,请键入 0x0001”
因为没有定义DoWork的实现可是asm文件也没有.h之类的头文件啊,在cpp中该如何使用呢?
郁闷啊~~~
我不是说去掉这两行就行了,这两行不影响编译的,只是执行到了的话可能会出问题。你把你asm里面的WDTMain改成_WDTMain试试
这个错误可能是无法找到asm 的函数
发现了关键点问题
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的代码都注释掉,工程就能编译成功!请问为什么啊
这句可以改成
MOV SI,0187H
.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 个 ==========感谢!
请问这是怎么计算的
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] 该怎么计算?
就是采用寻址方式,表示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(双字)定义
就像楼上有人说的一样,纯DOS的汇编无法在Win32下使用的,就算编译过了也不代表能用。
能改成windows的吗
INT 21h
这两句就是程序结束返回DOS命令行的调用至于能否改成Windows的,楼上已经回答了