我正在学习汇编,刚认识到你无法从32位linux运行16位读取模式代码。您必须设置适当的环境以从32位Linux运行16位代码。
所以我在Ubuntu上安装了DOSBOX并且能够运行16位代码,但现在我遇到了另一个问题。我想使用DOSBOX中的printf
函数。以下是代码:
section .data
x dw "value is =%d"
section .text
extern printf
global main
main:
push x
call printf
add sp,2
ret
但是当我汇编这段代码时,我收到以下错误:
binary output format does not support external references
现在我想知道在DOSBOX环境中进行printf
调用的正确方法是什么。
答案 0 :(得分:3)
在这种情况下,最好的建议是停止尝试编写16位实模式代码。如果您尝试学习汇编语言,那么在32位保护模式环境中工作时会更容易。
根据您的选择使用Linux或Windows。我建议也尝试FASM作为汇编程序。这是非常强大和初学者友好。有大量的示例代码和良好的社区。
答案 1 :(得分:1)
除了别人提到的......你想用Nasm的“-f obj”格式组装它,而不是“-f bin”(这是错误信息的样子)。您的格式字符串可能想要db
,而不是dw
。在Linux之外,您可能希望在main
和printf
上使用下划线。您可以编写没有下划线的源代码,并在Nasm的命令行上使用--prefix _
将前导下划线添加到任何global
或extern
。如果您正在使用OpenWatcom C,它需要尾随下划线(!) - 请改用--postfix _
。 (注意:需要两个连字符的少数Nasm选项之一)。
将此组装到“myprog.obj”后,您需要将其链接到C库。详细信息因您使用的编译器/链接器/库而异。
如果您只是尝试读取MBR,那么编写32位Linux代码可能更容易。然而,一个不同的问题。无论哪种方式,祝你好运!