0

我正在尝试链接一些程序集文件,但我遇到了一些问题。我使用 nasm 并使用以下内容制作我的目标文件:

nasm program.asm -f bin -o program.exe

书中的代码

    %include "io.mac"

.DATA
name_prompt db "Please type your name: ",0
out_msg db "Your name in capitals is: ",0

.UDATA
in_name resb 31

.CODE
    .STARTUP
    PutStr name_prompt ; request character string
    GetStr in_name,31 ; read input character string

    PutStr out_msg
    mov EBX,in_name ; EBX = pointer to in_name
process_char:
    mov AL,[EBX] ; move the char. to AL
    cmp AL,0 ; if it is the NULL character
    je done ; conversion done
    cmp AL,’a’ ; if (char < ’a’)
    jl not_lower_case ; not a lowercase letter
    cmp AL,’z’ ; if (char > ’z’)
    jg not_lower_case ; not a lowercase letter
lower_case:
    add AL,’A’-’a’ ; convert to uppercase
not_lower_case:
    PutCh AL ; write the character
    inc EBX ; EBX points to the next char.
    jmp process_char ; go back to process next char.
done:
nwln
    .EXIT

此代码在 Windows XP 上对我有效,但在 Windows 7 上无效,这是错误日志 错误。请帮我找出错误。

4

1 回答 1

1

错误消息中的行号似乎是指宏。如果 Nasm 没有找到该%include文件,它会抱怨,所以它会找到“io.mac”,但不喜欢它。作为一个 WAG,它看起来像已故的 Sivarama Dandamudi 博士的东西......你应该有你链接的“io.obj”,对吧?

您正在组装成 Nasm 的“-f bin”输出模式,该模式会生成一个平面二进制文件 - 而不是可链接的目标文件。“-o”开关导致输出文件被命名为“.exe”,但它仍然是一个平面二进制文件,不是“.exe”也不是可链接的目标文件。我强烈怀疑你应该组装到“-f obj”或“-f win32”并链接到......一些链接器......当它工作时你做了什么?我猜“-f obj”是你想要的。您可能不需要“-o”开关 - 默认文件名应该没问题。

如果一切都失败了,您可以尝试“-e”开关(仅限预处理)。这不会产生任何有用的输出,而只会扩展宏。这不会解决任何问题,但会让你确切地看到 Nasm 的抱怨。你不应该这样做!

尽管它使用 32 位寄存器,但这可能是 16 位代码(是的,您可以这样做)。XP 和 7 的区别在于 7 不会运行 DOS 代码。DosBox 应该会为您处理好这件事(如果一切顺利的话)。尝试组装到“-f obj”,看看它对你有什么作用。一旦你让 Nasm “闭嘴并组装”,我们就可以继续让它链接并运行......

于 2014-04-14T17:11:15.513 回答