温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - AS86 Set Origin Address (x86 assembly)
assembly nasm x86 as86

其他 - AS86设置原始地址(x86程序集)

发布于 2020-04-10 18:07:58

有谁知道如何使用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”字符。

再次感谢大家。

查看更多

提问者
Learning
被浏览
169
Nate Eldredge 2020-02-02 03:31

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

如您所述,代码似乎正确地布置了,但仍然无法正常工作。因此,我汇编了您的代码并反汇编了输出,问题变得很明显。

as86使用的语法nasm与其他传统的Intel样式的汇编器不同。特别是,像这样的指令将mov ah, 0x0e被解析为您可能理解的内容mov ah, [0x0e]从内存地址移了一个字节0x0e显然,您打算加载立即值,0x0e因此必须编写mov ah, #0x0e

看起来这将是经过仔细阅读一个好主意as86男人页在进行下一步之前。