【问题标题】:Label offsets in nasmnasm 中的标签偏移量
【发布时间】:2017-06-26 08:22:40
【问题描述】:

我正在尝试为 x86 编写一个简单的引导加载程序,但在理解 NASM 在组装程序时如何将标签转换为偏移量时遇到了问题。

(这只是一个演示程序)

bits 16
org 0x7C00

start:
    mov ax, 0x07C0
    mov ds, ax
    mov si, msg
    call print
    hlt

print:
    ; print char array stored in [ds:si]
    ret

msg db 'hello!'

我使用nasm -f bin 命令组装了代码。但它没有按预期工作。我在二进制输出上使用objdump -b binary -m i8086 -M intel -D,发现mov si, msgcall print对应的行被翻译成:

mov    si,0x7c0d
call   0xc

所以当 NASM 用偏移值替换 mov si, msg 中的 msg 时,它使用相对于 0x0000 的绝对偏移量,但是当它转换 call print 中的 print 到偏移量时,它使用相对于 cs 的偏移量这是0x07C0。因此,当我尝试打印字符 [ds:si] 时,它并没有指向预期的位置。问题是为什么?如果我做错了,那么正确的方法是什么?

【问题讨论】:

  • call 在机器码中具有相对 imm16 偏移量+0x0001,因此它正指向hlt 之后,并且可以正常工作。顺便说一句,使用远 jmp 0000:7C00 + <start_offset> 启动引导加载程序代码是一个好习惯,以确保 cs:ip 对此“标准化”,因为某些 BIOS 会以不同的变化启动引导加载程序,例如 07C0:0000,因此所有绝对偏移量和这样的 BIOS 通过cs 寻址将是错误的。

标签: assembly x86 nasm x86-16


【解决方案1】:

这是反汇编程序的产物:它将相对位移转换为绝对地址。
如果您将 0x7c00 作为原点传递,它将显示正确的值。

c:\>ndisasm -b 16 -o 7c00h a
00007C00  B8C007            mov ax,0x7c0
00007C03  8ED8              mov ds,ax
00007C05  BE0D7C            mov si,0x7c0d
00007C08  E80100            call word 0x7c0c
00007C0B  F4                hlt
00007C0C  C3                ret

ndisasm 示例

错误是您将 0x7c0 用于 ds,从 ds 中可以看出,此值的代码来源为零而不是 0x7c00。

例如,start 位于原点,对于 NASM,0x7c00 和 mov si, start 组装为 mov si, 0x7c00
在运行时start 位于线性地址 0x07c00 但指针[ds:si] 指向0x07c0:0x7c00 = 0x0f800,因为ds 已被初始化。

您可以将ds 初始化为零([ds:si] 将指向 0x0000:0x7c00 = 0x07c00)或将原点设置为零([ds:si] 将指向 0x07c0:0x0000 = 0x07c00)。

附带说明:您可以为 cs 和其他段使用不同的值,但这是您必须记住并注意的事情,例如,在您移动代码或设置 ISR 时。
但是,您必须初始化所有段寄存器,包括ss:sp
如果这是您第一次尝试使用引导加载程序,我建议您将 csds 相同。
无论如何,如果您想尝试不同的值,NASM 支持Multi-sectionsbin 输出格式,这是它支持的最接近分段的东西。

【讨论】:

  • 问题是我没有完全理解org 指令的作用。因此原始寄存器和段寄存器之间的不一致......
  • @Kia.celever 很高兴知道问题现在已解决 :) 出于好奇,请问您对 ORG 指令的错误解释是什么?我有时会教这些东西,它会帮助我了解一些常见的陷阱。
  • 我不知道 org 指令中的值实际上应该是相对于当前段的“偏移量”。我认为这是程序将驻留的绝对(20 位宽)物理地址。
  • 感谢@Kia.celever 的意见。
猜你喜欢
  • 2015-10-05
  • 2017-01-22
  • 2013-02-17
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-15
相关资源
最近更新 更多