如何将x86操作码数据从.data段位插入x86机器码中的操作数指令?

时间:2013-05-04 21:27:34

标签: x86 bootloader opcode

我正在开发一个完全用操作码编写的x86 bootloader,没有标题,都是二进制文件。

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

到目前为止,我有这个:

1000 101w 110

上面的代码应该等同于以下内容:

MOV SI

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

MOV SI, HELLO_WORLD_BYTE_STRING

有任何帮助吗?

3 个答案:

答案 0 :(得分:0)

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

您可以看到此链接http://www.vnutz.com/articles/PC_Bootsector_Programming_Tutorial_In_ASM

答案 1 :(得分:0)

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

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

使用汇编程序编写此函数可能会更有启发性,然后(手动或机械地)消除它(以便更好地了解汇编程序正在执行的操作)。

答案 2 :(得分:0)

   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

德克