有人知道如何使用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‘字符。
再次感谢大家。
发布于 2020-02-02 03:31:46
第一个问题是需要使用-s,正如Jester的评论所指出的那样。
正如您所注意到的,代码看起来布局正确,但仍然无法工作。因此,我组装了您的代码并反汇编了输出,问题就变得很明显了。
as86使用与nasm和其他传统英特尔风格的汇编程序不同的语法。特别是,像mov ah, 0x0e这样的指令被解析为您可能理解为mov ah, [0x0e]的指令;它是从内存地址0x0e移动一个字节。显然,您的意思是加载立即值0x0e,因此您必须编写mov ah, #0x0e。
在继续学习之前,仔细阅读一下the 似乎是个好主意。
https://stackoverflow.com/questions/60013546
复制相似问题