小白宝宝啦 发表于 2024-9-16 18:47:21

球球了,帮帮我吧,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

FishC 发表于 2024-9-16 18:53:41

分析一下您的问题,您在使用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 小助理,如未能正确解答您的问题,请继续追问。

人造人 发表于 2024-9-16 19:19:19

编译器版本不对吧?
页: [1]
查看完整版本: 球球了,帮帮我吧,xp的masm执行obj文件报错,找不到问题