You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NASM更新edi寄存器时报invalid operand type错误是什么原因

错误原因

mov edi, s1+bx 触发invalid operand type错误有两个核心原因:

  • 位宽不匹配:edi是32位通用寄存器,bx是16位基址寄存器,两者位宽不一致,汇编器无法直接解析混合位宽的地址表达式。
  • 寻址规则不支持:s1是编译期确定的静态地址常量,bx是运行时动态变化的寄存器值,两者的和无法作为立即数直接赋值给寄存器。只有内存寻址场景下可以使用s1+bx这类基址+偏移的表达式(比如mov al, [s1+bx]是合法的,作用是取s1偏移bx位置的内存值到al),但不能直接用来给寄存器赋值地址。

最优实现方案

根据你使用的汇编位宽可以选择对应方案:

32位汇编场景(使用edi的常规场景)

直接用lea(加载有效地址)指令完成地址计算,同时将偏移量改为32位的ebx寄存器匹配位宽:

; 初始化时ebx置0作为偏移计数器
lea edi, [s1 + ebx]
; 处理完s1需要切换到s2时同理
lea edi, [s2 + ebx]
; 每次循环后递增偏移
inc ebx

如果不需要复用edi做其他操作,更高效的方案是直接用两个寄存器分别存储两个列表的起始地址,用计数器统一寻址,避免循环内重复给edi赋值:

mov esi, s1      ; 存第一个列表的起始地址
mov edi, s2      ; 存第二个列表的起始地址
xor ecx, ecx     ; 循环计数器初始化为0
loop_begin:
  ; 直接操作对应偏移的元素,示例为写入0x10和0x20
  mov byte ptr [esi + ecx], 0x10
  mov byte ptr [edi + ecx], 0x20
  inc ecx
  cmp ecx, 列表预设长度
  jne loop_begin

16位汇编场景

如果是16位实模式代码,将目标寄存器改为16位的di,分两步计算地址:

mov ax, s1
add ax, bx
mov di, ax

内容的提问来源于stack exchange,提问作者AxlTfr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 03:57:03