2017-10-18 69 views
0

我把下面的代码NASM:[ORG 0x7C00]对文件实际做了什么?

[BITS 16] 
[ORG 0x7C00] 

TIMES 510 - ($ - $$) db 0 

,并在我的十六进制编辑器看了一下,发现了一堆0的。这是我所期望的,但现在我问这个问题:[ORG 0x7C00]实际上对文件做了什么?

+3

在此代码示例中,ORG指令不会直接执行任何操作。它设置所有绝对地址相对于的偏移量。你在这个无所作为的代码中没有绝对的偏移量,所以你没有看到它们的差异。定义一些内存来保存一些数据并将数据移动到该地址(通过标签)。如果更改org指令,则应该注意内存地址的差异。 –

+2

只需在'ORG'下添加'mov ax,[$]'并生成二进制文件,它将以字节'a1 00 7c 00'开始(即'a1'指令具有编码的硬偏移量'0x7C00', 'ORG'将下一条指令视为内存中的0x7C00偏移量,即'$ == 0x7C00')。文档:[7.1.1 ORG:二进制文件程序来源](http://www.nasm.us/doc/nasmdoc7.html#section-7.1.1)(有趣的是* * *,列表文件显示了操作码在“连接”之前,即'A1 [0000]'......这是不幸的)。 – Ped7g

回答

0

ORG指令用于向汇编器和链接器提供结果目标文件的“提示”。它允许你指定文件部分的基地址。

当创建“函数”(您可能会遇到的问题CALL)时,如果这些函数与您的调用距离足够远,汇编器将需要使用绝对地址进行调用,而不是使用当前指令的偏移量。 ORG指令有效锁定代码,使其不依赖于位置的代码。

在实践中,除非你正在写很长的代码块,大部分的JMPCALL说明会SHORTNEAR,允许使用简单的偏移。

+2

在NASM中,当输出到中间对象时,'ORG'指令不适用,只是'bin'目标。这不仅仅是一个提示,它是NASM需要确定从何时开始直接输出二进制文件时的偏移量。 ORG指令的缺失会导致原点为0.如果您尝试使用ORG并输出到类似精灵对象的东西,它应该会出错。 –

+1

当'call'超出'rel16'调用的范围时,你确定NASM会发出'far call ptr16:16'吗?这没有意义,因为远程调用不仅仅是返回地址。 (没有绝对的直接接近呼叫,我怀疑NASM会发出'mov ax,target'/'call ax')。总之,有很多方法可以生成位置相关的代码,例如, 'mov ax,label'或'mov ax,[label]',然后ORG进入游戏。 –

相关问题