Assembly NASM:发出非标量(链路时间)值的MSW

Assembly NASM:发出非标量(链路时间)值的MSW,assembly,x86,nasm,ld,osdev,Assembly,X86,Nasm,Ld,Osdev,我试图在中定义一个常量条目,为此,我需要将双字地址的高位字发送到数据表中,该双字地址直到链接时间才解析。有办法吗 以下是中断处理程序: ;;; Interrupt 3 (breakpoint) handler. For now, just poke the screen and halt. align 8 int3: mov [0xb8000],dword '* * ' hlt 这是引用它的IDT条目。偏移量的最高有效和最低有效字

我试图在中定义一个常量条目,为此,我需要将双字地址的高位字发送到数据表中,该双字地址直到链接时间才解析。有办法吗

以下是中断处理程序:

;;; Interrupt 3 (breakpoint) handler.  For now, just poke the screen and halt.

        align   8
int3:
        mov     [0xb8000],dword '* * '
        hlt
这是引用它的IDT条目。偏移量的最高有效和最低有效字需要单独且不连续地存储:

        ;; Interrupt 3 - breakpoint
        dw      int3                    ; offset (low)    <---- WORKS
        dw      codesel                 ; code selector
        db      0                       ; unused
        db      0b10001111              ; present, ring 0, 32-bit trap gate
        dw      int3 >> 16              ; offset (high)   <---- ASSEMBLY ERROR
;;中断3-断点

dw int3;偏移量(低)>16;偏移量(高)井。。。你可能知道,Nasm会屈尊改变两个标签之间的差异。通常的构造类似于:

dw(int3-$)>>16

其中,
$
指本节的开头。这将计算“文件偏移量”。这可能不是您要转换的值

dw(int3-$$+原点)>>16

我可以做你想做的。。。其中
ORIGIN
是。。。好吧,如果我们使用的是平面二进制文件,那么我们告诉Nasm关于
org
。我假设您正在组装到
-f elf32
-f elf64
,告诉ld
--oformat=binary
,并在链接器脚本或命令行中告诉ld您希望
.text
的位置(?)。这似乎奏效了。
我有一个有趣的发现:如果你告诉ld
-oformat=binary
(一个连字符)而不是
-oformat=binary
(两个连字符),ld将不会自动输出任何东西!不要这样做-你浪费了很多时间

谢谢你的回答。我正在组装到“-f aout”,但是“-f elf32”并没有改变任何事情:无论哪种方式,ORG都被nasm拒绝,因为我没有生成一个平面二进制文件。如果我不想在运行时构建IDT,我想这就指向了“绝对定位(部分)我的程序”的解决方法。关于“不要这样做”:“
ld
有很多单字母选项,包括
-o输出\u文件名
。因此,
ld-o'format=binary'
是它仅用一个破折号进行解析的方式。另请参见:。严格地说,这个问题是那个问题的重复——它是同一个问题,具有相同的原因(ld+swizzled IDT),但语言不同。相关:同一问题的C版本:。ELF并没有为此搬迁,所以你基本上完蛋了;你可以让操作系统在加载自己后进行修复。我知道这个问题已经有6年多的历史了,但我最近写了一个相关问题的答案,通过在链接器脚本(和C预处理器)中构建IDT和GDT提供了一个解决方案。这种方法是在链接时生成的。@MichaelPetch投票结束自己的问题,选择一个更好的问题,这是一件特别令人满意的事情。谢谢这不是我的优势。我所做的不是询问问题,而是询问实际的解决方案。我希望最初的问题/答案可能会吸引其他人提供他们自己的机制并创造新的答案。碰巧你的变成了复制品。不过,我们可以同时清理一下OSDev标记,这很好。