错误:通过寄存器相乘时操作数类型无效

Mar*_*ian 0 x86 assembly nasm addressing-mode

我正在用 x86_64 汇编语言编写一个程序,它需要我通过变量来偏移内存地址。我试图使用 来*乘以地址edx,但是出现以下错误:

    kernel.asm:23: error: invalid operand type
Run Code Online (Sandbox Code Playgroud)

为什么会发生这种情况以及如何解决我的问题?这是我的代码:

mov edx, 1
mov ebx, 0xb8000+160*edx
inc edx
Run Code Online (Sandbox Code Playgroud)

zx4*_*485 5

问题是您的指令无效,因为内存操作数需要用方括号括起来。应用此更改您将拥有mov ebx, [0xb8000+160*edx]. 使用NASM 也允许的十六进制数字的Intel/MASM/DOS 表示法mov ebx, [0b8000h+160*edx],您将得到. 该指令仍然是错误的,因为 x86 ISA 上编码的指令的 SIB 字节只允许比例因子2,4和 ,8英特尔手册的表 2-3 中所述。160 不是有效的比例因子。最后,你想要计算地址,所以最好使用LEA而不是 mov: lea ebx, [0b8000h+2/4/8*edx]

您必须使用其他指令(如MULIMULSHL或 )来计算该值INC,以获得您想要的结果值。

例如,假设 80x25 文本模式(使用IMUL而不是MUL注释中建议的方式),您可以执行以下计算来定位光标(使用 ECX=X 和 EDX=Y):

mov ecx, X             ; where X might be [esp+8] or [xpos] or whatever
mov edx, Y             ; you may not need a register, imul-immediate can load
; with inputs in registers
imul ebx, edx, 160    ; calculate line offset
lea ebx, [0B8000h + ebx+ecx*2]  ; add column offset and base address
                      ; Now EBX is Y*160+X*2
Run Code Online (Sandbox Code Playgroud)