球球了,帮帮我吧,xp的masm执行obj文件报错,找不到问题
我在xp虚拟机里安装了masm,然后使用命令行窗口进入asm文件夹,执行了ml /c test.asm,生成了test.obj,但再使用link /subsystem:console test.obj就报错:test.obj:warning lnk4033:converting object format from omf to coff
link:lnk2001:unresolved external symbol _winmaincrtstartup
test.exe:fatal error lnk1120:1 resolved externals
下面是我test.asm的代码
assume cs:code
code segment
mov bx,0B800H
mov es,bx
mov bx,160*10 + 40*2
mov word ptr es:,5535H
mov ax,4C00H
int 21H
code ends
end 分析一下您的问题,您在使用MASM时遇到了链接错误。这个错误通常是因为编译目标格式和链接的库不匹配或缺少标准库函数。可以通过以下步骤解决。
### 解决方案:
1. **安装 MASM32 SDK:**
MASM32 SDK 自带一套完善的工具链,特别适合在 XP 环境下进行汇编开发。可以从 (http://www.masm32.com/)下载并安装。
2. **调整汇编代码:**
您的汇编代码是独立的 DOS 程序,不需要 Windows 特定的入口函数(如 `WinMain` 或 `_winmaincrtstartup`)。确保代码中不调用 Windows API,从而保持独立的 DOS 程序格式。
3. **修改编译、链接命令:**
确保目标格式一致。使用适当的转换工具(如 TASM(Turbo Assembler))来避免 OMF 格式的对象文件与 COFF 格式链接器不匹配。
4. **使用正确的链接器:**
可尝试直接用 DOS 链接器,避免使用 Windows 链接器。例如:
tlink /t test.obj
### 示例:
如果希望在 MASM32 SDK 环境中编译和链接,可以这样做:
#### test.asm
.386
.model flat, stdcall
.stack 4096
.data
msg db 'Hello, World!', 0
.code
main proc
mov edx, offset msg
call print_text
invoke ExitProcess, 0
main endp
print_text proc
; DOS 10行40列位置显示
mov bx, 0B800H
mov es, bx
; keep content - 160*10 + 40*2 标示在10行40列显示
mov bx, 160*10 + 40*2
; write character with attribute
mov word ptr es:, 5535H; 55H = 'U', 35H = 黄色背景
ret
print_text endp
end main
#### 编译和链接:
使用 MASM32 提供的 `ml` 和 `link` 工具:
ml /c /coff test.asm
link /subsystem:console test.obj kernel32.lib user32.lib
这样就可以正确地编译链接汇编代码,并生成一个可执行文件。记得将库添加到正确路径,否则链接时会报找不到库文件错误。
希望这些建议对您有所帮助,加油!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 编译器版本不对吧?
页:
[1]