【问题标题】:How to insert x86 opcode data from .data segment bits in to operand instruction in x86 machine code?如何将 x86 操作码数据从 .data 段位插入 x86 机器代码中的操作数指令?
【发布时间】:2013-05-04 21:27:34
【问题描述】:

我正在开发一个完全用操作码编写的 x86 引导加载程序,没有标头,全是二进制文件。

问题在于英特尔的 ISA 手册不包括如何将 .data 段代码中的数据段字节包含到操作码格式的机器指令的辅助操作数中。

到目前为止我有这个:

1000 101w 110

上面的代码应该等价于以下:

MOV SI

但是,我需要将数据插入到包含“Hello World”的源索引寄存器中,以便以单色文本视频模式显示在屏幕上,如下所示:

MOV SI, HELLO_WORLD_BYTE_STRING

有什么帮助吗?

【问题讨论】:

    标签: x86 bootloader opcode


    【解决方案1】:

    引导加载程序从 BIOS 加载到固定地址 (0000:7C00),因此如果您将字符串放在代码中的某个位置,您可以使用距程序开头的偏移量来引用它。

    你可以看到这个链接http://www.vnutz.com/articles/PC_Bootsector_Programming_Tutorial_In_ASM

    【讨论】:

    • 我不认为你真的明白我在这里想要做什么。我需要知道如何将数据字节段中的内存地址的操作数作为操作数插入到要使用的源索引寄存器中(在 x86 操作码中)。
    • 我也不确定我是否理解你在这里想要做什么。您说您想“将操作数插入操作数”。您的意思是要将数据段中字节的值写入指令中间吗?还是你问如何将数据段中字节的地址作为指令操作数?我的猜测是后者(因为前者只是愚蠢),在这种情况下,您真正​​要问的是“如何获取数据段中偏移量 1000 的运行时地址?”
    【解决方案2】:

    汇编器/链接器工具链提供了单独的代码和数据段等抽象。当您编写原始机器代码时,您必须自己完成这项工作。您可以选择交错代码和数据,只要您确保不会意外尝试执行代码即可。

    对于您尝试编写的mov 指令,最简单的实现是第二个操作数是包含字符串开头地址的立即字。该地址将是您决定放置字符串数据的任何位置。 (汇编程序会预先计算此值。)因此,您需要操作码0b1011 1110 后跟地址的低字节和高字节。然后SI 将包含指向字符串开头的指针。

    使用汇编器编写此代码可能对您更有指导意义,然后将其分解(手动或机械地)以更好地了解汇编器在做什么。

    【讨论】:

      【解决方案3】:
         VALUE DB 0xFF
                      mov bx, Offset VALUE
                      mov di, Offset P1
                      mov cs:[di+1], bx ; writing the offsetaddress of "VALUE" into
         P1: BE 00 10 mov si, 0x1000    ; <- this instruction inside of our codesegment
      

      德克

      【讨论】:

        猜你喜欢
        • 2022-11-23
        • 2016-10-03
        • 1970-01-01
        • 2022-11-24
        • 1970-01-01
        • 2021-10-23
        • 1970-01-01
        • 1970-01-01
        • 2015-11-12
        相关资源
        最近更新 更多