如何在DOSBOX中使用printf函数

时间:2013-07-13 15:18:05

标签: assembly x86

我正在学习汇编,刚认识到你无法从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调用的正确方法是什么。

2 个答案:

答案 0 :(得分:3)

在这种情况下,最好的建议是停止尝试编写16位实模式代码。如果您尝试学习汇编语言,那么在32位保护模式环境中工作时会更容易。

根据您的选择使用Linux或Windows。我建议也尝试FASM作为汇编程序。这是非常强大和初学者友好。有大量的示例代码和良好的社区。

答案 1 :(得分:1)

除了别人提到的......你想用Nasm的“-f obj”格式组装它,而不是“-f bin”(这是错误信息的样子)。您的格式字符串可能想要db,而不是dw。在Linux之外,您可能希望在mainprintf上使用下划线。您可以编写没有下划线的源代码,并在Nasm的命令行上使用--prefix _将前导下划线添加到任何globalextern。如果您正在使用OpenWatcom C,它需要尾随下划线(!) - 请改用--postfix _。 (注意:需要两个连字符的少数Nasm选项之一)。

将此组装到“myprog.obj”后,您需要将其链接到C库。详细信息因您使用的编译器/链接器/库而异。

如果您只是尝试读取MBR,那么编写32位Linux代码可能更容易。然而,一个不同的问题。无论哪种方式,祝你好运!