【发布时间】:2019-03-16 07:56:30
【问题描述】:
我在下面的汇编代码中遇到了上面提到的这个错误,我在网上也找不到关于这个错误代码的太多信息。
mov ax,main_data
mov ds,ax
mov bx,gdt_info
lgdt [bx]
main_data segment use16
gdt_start:
c32_gdt GDT <0,0,0,0,0,0>
d32_gdt GDT <0,0,0,0,0,0>
gdt_info:
dw gdt_info - gdt_start - 1
dd gdt_start
main_data ends
【问题讨论】:
-
这很奇怪,LGDT 没有操作数大小的选择。 felixcloutier.com/x86/lgdt:lidt 表示 16 位或 32 位模式下的内存操作数固定为
m16&32(即 48 位 = 6 字节)。如果这是 MASM,请尝试使用lgdt [gdt_info]让符号暗示操作数大小。 -
您的汇编程序是否需要
mov ax,@main_data才能立即获得段基?通常在 MASM 中,mov ax, symbol是一个负载。无论如何,我认为链接器错误是一个单独的问题。你应该用你正在使用的汇编程序标记这个问题。 (MASM 或 TASM,我不知道这个指定操作数大小的要求是否特定于其中一个。) -
没有链接器错误,那是我很笨。
-
@Peter,即使操作数在两种情况下都是 6 个字节,16 位和 32 位操作数大小之间也存在差异。您链接的参考文献第一段的第三和第四句对此进行了解释。
标签: assembly masm x86-16 bootloader osdev