我正在尝试制作一个软盘操作系统,它现在还处于测试阶段。我试着保留2个扇区用于配置,并将数据加载到0x7100中。但是,即使我确保值为1,它仍然返回0。下面是我尝试用来读取变量的代码:
MOV AL, BYTE [0x7101]
CMP AL, 1
JE insertfunctionnamehere
请注意,这个过程是在我跳出引导程序代码之后进行的。
这是我在引导加载程序中使用的代码,用于将值放入0x7100:
MOV AX, 0x7100
MOV ES, AX
MOV CL, 17
MOV BX, 0
MOV DH, 0
MOV CH, 0
MOV AL, 2
MOV DL, BYTE [0x7FFF]
MOV AH, 02h
INT 0x13
JC error1
CMP AL, 2
JNE error3
我不知道为什么有些值有效,而有些值无效。我尝试更改存储内存的位置,但没有效果。有人知道如何帮助我吗?如果有帮助,我将使用NASM 16位。
1条答案
按热度按时间7jmck4yq1#
该代码不读取相同的内存时,使用加载两个扇区从磁盘!
很可能您的
DS
段寄存器为0,因此此指令从DS:0x7101
读取一个字节,即线性地址0x 00007101。这将在
ES:BX
中建立一个指向线性地址0x 00071000的远指针0x 7100:0x 0000。在这里,您将加载保存数据的两个扇区。混乱之处在于,在第一个代码段中,您使用0x 7100 + 1作为偏移地址,而在第二个代码段中,您使用0x 7100作为段号。
解决方案取决于您如何设置和使用段寄存器。
如果
ES
保持其值0x 7100,则可以向指令添加一个段覆盖前缀,并使用一个小偏移量地址,如:MOV AL, [ES:0x0001]
.但是让
DS
指向程序的数据可能更方便,然后你应该先设置DS
,然后(再次)用一个小的偏移地址来寻址你的变量: