【问题标题】:error A2023 instruction operand must have size with LGDT instruction错误 A2023 指令操作数必须具有 LGDT 指令的大小
【发布时间】: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&amp;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


【解决方案1】:

得到它的工作需要通过fword指定指针大小 gdt 寄存器的大小为 48 位或 6 个字节,因此要使其正常工作: lgdt fword ptr [bx]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多