首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于DOSBox的NASM编译

基于DOSBox的NASM编译
EN

Stack Overflow用户
提问于 2014-04-14 18:16:37
回答 1查看 3.1K关注 0票数 0

我正在尝试链接一些程序集文件,但遇到了一些问题。我使用nasm并使用以下命令创建目标文件:

代码语言:javascript
复制
nasm program.asm -f bin -o program.exe

书中的代码

代码语言:javascript
复制
    %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,但不适用于Windows7,这是错误日志error.Please帮助我找到错误。

EN

回答 1

Stack Overflow用户

发布于 2014-04-15 01:11:16

错误消息中的行号似乎指的是宏。如果没有找到%include文件,Nasm会报错,所以它找到了"io.mac",但不喜欢它。作为一个WAG,它看起来像是已故的西瓦拉玛·丹达穆迪博士的东西...你应该有链接的"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“关闭并组装”,我们就可以继续让它链接并运行……

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23057539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档