我正在尝试链接一些程序集文件,但遇到了一些问题。我使用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,但不适用于Windows7,这是错误日志error.Please帮助我找到错误。
发布于 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“关闭并组装”,我们就可以继续让它链接并运行……
https://stackoverflow.com/questions/23057539
复制相似问题