-2

我正在学习汇编,才知道你不能从 32 位 linux 运行 16 位读取模式代码。您必须设置适当的环境才能从 32 位 Linux 运行 16 位代码。

所以我在 Ubuntu 上安装了 DOSBOX 并且能够运行 16 位代码,但我现在遇到了另一个问题。我想使用printfDOSBOX 中的功能。下面是代码:

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 

现在我想知道printf在 DOSBOX 环境中调用的正确方法是什么。

4

2 回答 2

3

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

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

于 2013-07-13T15:57:18.280 回答
1

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

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

如果您只是想读取您的 MBR,那么编写 32 位 Linux 代码来执行此操作可能更容易。然而,一个不同的问题。不管怎样,祝你好运!

于 2013-07-13T17:51:14.153 回答