我正在开发一个完全用操作码编写的x86 bootloader,没有标题,都是二进制文件。
问题在于英特尔的ISA手册不包括如何将.data段代码中的数据段字节包含在操作码格式的机器指令的辅助操作数中。
到目前为止,我有这个:
1000 101w 110
上面的代码应该等同于以下内容:
MOV SI
但是,我需要将数据插入包含“Hello World”的Source Index寄存器,以单色文本视频模式显示在屏幕上,如下所示:
MOV SI, HELLO_WORLD_BYTE_STRING
有任何帮助吗?
答案 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
德克