0

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

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

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

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

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 指令正在填充文件的其余部分,其方式与使用“times”指令的 NASM 发生的方式相同。

谢谢!

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

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

因此,在修复了该问题之后,测试代码在启动时运行并按预期打印“a”字符。

再次感谢大家。

4

1 回答 1

2

-s正如 Jester 的评论所指出的,第一个问题是需要使用。

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

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

as86继续之前仔细阅读手册页似乎是个好主意。

于 2020-02-01T19:31:46.260 回答