16位汇编程序,即使在将值设置为1之后也将内存值返回为0



我正在尝试制作一个软盘操作系统,该系统目前处于测试阶段。我尝试保留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]

相关内容

  • 没有找到相关文章

最新更新