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

如何将x86操作码数据从数据段位插入x86机器码的操作数指令?,x86,bootloader,opcode,X86,Bootloader,Opcode,我正在开发一个完全用操作码编写的x86引导加载程序,没有头文件,全部是二进制文件 问题在于,英特尔的ISA手册没有包括如何将.data segment code中的数据段字节包含到操作码格式的机器指令辅助操作数中 到目前为止,我有: 1000 101w 110 上述代码应等同于以下代码: MOV SI 但是,我需要将数据插入包含“Hello World”的源索引寄存器,以单色文本视频模式显示在屏幕上,如下所示: MOV SI, HELLO_WORLD_BYTE_STRING 有什么帮助吗

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

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

到目前为止,我有:

1000 101w 110
上述代码应等同于以下代码:

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

MOV SI, HELLO_WORLD_BYTE_STRING

有什么帮助吗

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


您可以看到此链接

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

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

对于您来说,使用汇编程序编写这篇文章可能更具指导意义,然后(通过手工或机械方式)对其进行解释,以便更好地了解汇编程序的工作。

VALUE DB 0xFF
   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
mov bx,偏移值 mov di,偏移量P1 mov cs:[di+1],bx;将“VALUE”的偏移地址写入
P1:BE 00 10 mov si,0x1000;我不认为你真的明白我在这里要做什么。我需要知道如何将内存地址的操作数作为操作数从数据字节段插入源索引寄存器以供使用(在x86操作码中)。我也不知道您在这里要做什么。您说要“将操作数插入操作数”。您的意思是要将数据段中的字节值写入指令的中间吗?或者您正在询问如何使用数据段中字节的地址作为指令操作数?我猜是后者(因为前者很傻),在这种情况下,您真正要问的是“如何获得数据段中偏移量1000的运行时地址?”