有谁知道如何使用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”字符。
再次感谢大家。
-s
正如Jester的评论所指出的那样,第一个问题是需要使用。
如您所述,代码似乎正确地布置了,但仍然无法正常工作。因此,我汇编了您的代码并反汇编了输出,问题变得很明显。
as86
使用的语法nasm
与其他传统的Intel样式的汇编器不同。特别是,像这样的指令将mov ah, 0x0e
被解析为您可能理解的内容mov ah, [0x0e]
;从内存地址移了一个字节0x0e
。显然,您打算加载立即值,0x0e
因此必须编写mov ah, #0x0e
。
看起来这将是经过仔细阅读一个好主意的as86
男人页在进行下一步之前。