2014-04-14 66 views
0

我想链接一些程序集文件,但我遇到了一些问题。我使用NASM,我让我的对象文件与:在DOSBox上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中无法正常工作,这里是错误日志 error。请帮我找到错误。

+0

那些引号看起来很可疑。他们应该是'''而不是'''。并确保汇编程序找到宏文件。 – Michael

+0

io.mac位于nasm和program.asm文件中,但我不知道如何检查汇编程序是否找到此文件。 – Damian

回答

0

错误消息中的行号似乎是指宏。 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“闭嘴并组装”,我们可以继续将它连接起来并运行......