AS86 设置源地址(x86 汇编)

AS86 Set Origin Address (x86 assembly)

有谁知道如何使用 AS86 语法设置源地址?

使用 NASM,例如(在 BIOS 引导加载程序中):ORG 0x7c00。

有谁知道对应的 AS86 是什么?或者功能等价物是什么?

我正在使用 AS86,因为我正在使用 BCC(Bruce 的 C 编译器)的 16 位汇编输出编译程序。如果有人知道真正的 16 位 C 编译器会生成 NASM 兼容的程序集,那也将从根本上解决我的问题(因为,与 AS86 不同,我对获得 NASM' 没有任何问题s 原始二进制文件使用特定的内存地址偏移量工作)。

2/1 使用示例 AS86 代码进行编辑:

ORG 0x7c00

USE16

mov ah, 0x0e
mov al, 0x61
xor bx, bx
int 0x10

ORG 0x7DFE
.word 0xAA55

生成的符号文件(似乎正确):

+ 00007C00 ----- $start
+ 00007E00 ----- $end

并且生成的二进制文件是 512 字节,这意味着(我认为)末尾的 ORG 指令以与 NASM 使用 "times" 指令。

谢谢!

最终编辑:所以这已经解决了。从我收到的帮助来看,解决源地址问题的方法是将源地址放在开头使用 ORG 指令,然后在末尾也使用 ORG 指令指定程序应该位于的内存地址文件中的那个特定点。然后,汇编语言文件必须使用 -s 选项在 as86 中编译以生成符号文件。

然后,即使内存地址问题已解决,这段代码仍无法正常工作的原因是因为我没有仔细阅读手册页并且没有有效地加载(到寄存器中)内存位置的内容在我使用的操作数中指定,而不是它们的立即值。

因此,在解决该问题后,测试代码会在启动时运行并按预期打印 'a' 字符。

再次感谢大家。

Jester 的评论指出,第一个问题需要使用 -s

如您所述,代码布局似乎正确,但仍然无法正常工作。所以我组装了你的代码并反汇编了输出,问题变得清晰了。

as86 使用与 nasm 和其他传统 Intel 风格的汇编程序不同的语法。特别是,像 mov ah, 0x0e 这样的指令被解析为您可能理解的 mov ah, [0x0e];它是从内存地址 0x0e 移动一个字节。显然,你打算加载立即值 0x0e 所以你必须写 mov ah, #0x0e.

在继续之前仔细阅读 the as86 man page 似乎是个好主意。