【发布时间】:2020-05-17 16:38:12
【问题描述】:
有人知道如何使用 AS86 语法设置源地址吗?
使用 NASM,您可以输入,例如(在 BIOS 引导加载程序中):ORG 0x7c00。
有谁知道 AS86 等价物是什么?或者功能等价物是什么?
我使用 AS86 是因为我正在使用 BCC(Bruce 的 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”字符。
再次感谢大家。
【问题讨论】:
-
根据手册页
org应该可以工作,它对我有用。你遇到了什么错误? -
在 AS86 中,我使用 org 指令填充 '0' 字节(以制作漂亮的 512 字节二进制文件,我可以将其写入 virtualbox 将接受的虚拟软盘映像的扇区)。所以对我来说,AS86 的“org”指令等同于 NASM 的“times”指令。当我尝试以与在 NASM 中使用它的方式相同的方式使用“org”指令时(例如,ORG 0x7e00),AS86 生成了一个约 2 千字节的二进制文件(而不是预期的 512 字节文件)。您是否有一个示例说明如何使用“org”和 AS86 来指定源地址而不是充当字节填充器?谢谢
-
您可能错过了手册中的
-s命令行选项:“如果没有 -s 选项,则文件从位置 0 开始”。 -
@Jester 你知道你将如何使用 -s 标志吗?在命令行上,我使用了“as86 -0 boot.asm -s boot.sym -b boot.bin”。我将在上面的主帖中发布我当前的示例 AS86 引导加载程序代码并进行编辑。简而言之,生成的符号文件显示了正确的开始和结束地址。并且生成的二进制文件是 512 字节(意味着填充也起作用)。但是当我在 virtualbox 上加载二进制文件时,它不起作用。相比之下,NASM 生成的二进制文件在中间带有特定的 bios 中断代码,工作正常。感谢您提供的任何帮助。
-
很明显,您创建的二进制文件有些不同。它只有 512 个字节,因此您基本上可以区分二进制文件。您可以使用 Unix 命令
cmp -l as86.bin nasm.bin来查看它们是否不同,如果不同,在哪里。或者用ndisasm拆解它们并区分文本。