我正在尝试制作一个软盘操作系统,该系统目前处于测试阶段。我尝试保留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位。
代码读取的内存与从磁盘加载两个扇区时使用的内存不同!
MOV AL, BYTE [0x7101]
很可能您的DS
段寄存器为0,因此此指令从DS:0x7101
读取一个字节,该字节为线性地址0x00007101。
MOV AX, 0x7100 MOV ES, AX MOV BX, 0
这在ES:BX
中建立了一个指向线性地址的远指针0x710:0000100x00071000。在这里,您可以加载保存数据的两个扇区。
令人困惑的是,在第一个片段中,您使用0x7100+1作为偏移地址,而在第二个片段中使用0x7100作为段号。
解决方案取决于如何设置和使用段寄存器。
如果ES
保持其值0x7100,则可以向指令添加段覆盖前缀,并使用小偏移地址,如:MOV AL, [ES:0x0001]
。
但是,也许在程序的数据上设置DS
点更方便,然后您应该首先设置DS
,然后用(再次(一个小偏移地址来寻址您的变量:
mov ax, 0x7100
mov ds, ax
...
mov al, [0x0001]