assembly 16-位汇编程序即使在将值设置为1后仍将存储器值返回为0

7ajki6be  于 2022-11-13  发布在  其他
关注(0)|答案(1)|浏览(148)

我正在尝试制作一个软盘操作系统,它现在还处于测试阶段。我试着保留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位。

7jmck4yq

7jmck4yq1#

该代码不读取相同的内存时,使用加载两个扇区从磁盘!

MOV AL, BYTE [0x7101]

很可能您的DS段寄存器为0,因此此指令从DS:0x7101读取一个字节,即线性地址0x 00007101

MOV AX, 0x7100
MOV ES, AX
MOV BX, 0

这将在ES:BX中建立一个指向线性地址0x 00071000的远指针0x 7100:0x 0000。在这里,您将加载保存数据的两个扇区。
混乱之处在于,在第一个代码段中,您使用0x 7100 + 1作为偏移地址,而在第二个代码段中,您使用0x 7100作为段号。
解决方案取决于您如何设置和使用段寄存器。
如果ES保持其值0x 7100,则可以向指令添加一个段覆盖前缀,并使用一个小偏移量地址,如:MOV AL, [ES:0x0001] .
但是让DS指向程序的数据可能更方便,然后你应该先设置DS,然后(再次)用一个小的偏移地址来寻址你的变量:

mov ax, 0x7100
mov ds, ax
...
mov al, [0x0001]

相关问题