如何使用指令 LODSB 将每隔一个数字加载到寄存器中

how to load every second number into registers using the instruction LODSB

我有一个代码,可以从 numbers table 中找到 10 个数字的总和。我怎样才能找到所有其他数字的正确总和?您是否需要以某种方式使用 lodsb 将每个第二个数字加载 eax 到 EAX 中?或者你还需要用add指令做些什么吗?

    cld

    mov esi, OFFSET numbers ; in `numbers` i have 10 numbers
    mov edi, esi
    
    mov ecx, 10
    myLoop:
    push ecx
        lodsb ; here i add each digit in turn to the `eax` register
        add sum, eax ; here i summarize the numbers
    pop ecx
    loop myLoop
    
    mov eax, sum

I have a code where I find the sum of 10 numbers from the numbers table.

字节数组

假设您的代码对这 10 个数字求和是正确的,唯一缺少的是事先将 EAX 寄存器归零。这不是 LODSB 要做的事情!

  mov  esi, OFFSET numbers
  mov  ecx, 10
  xor  eax, eax
myLoop:
  lodsb
  add  sum, eax
  loop myLoop
  mov  eax, sum

每秒只求和byte

  mov  esi, OFFSET numbers
  mov  ecx, 10 / 2 ; Half
  xor  eax, eax
myLoop:
  inc  esi         ; Skip (or use an extra LODSB here)
  lodsb
  add  sum, eax
  dec  ecx
  jnz  myLoop
  mov  eax, sum

双字数组

LODSB指令没有载入整数。使用 LODSD.

  mov  esi, OFFSET numbers
  mov  ecx, 10
myLoop:
  lodsd
  add  sum, eax
  loop myLoop
  mov  eax, sum

每秒只求和dword

  mov  esi, OFFSET numbers
  mov  ecx, 10 / 2 ; Half
myLoop:
  add  esi, 4      ; Skip (or use an extra LODSD here)
  lodsd
  add  sum, eax
  dec  ecx
  jnz  myLoop
  mov  eax, sum

与@Jester 的建议类似。

  mov  ecx, (10 / 2) - 1
myLoop:
  add  eax, [numbers + ecx * 8 + 4]
  dec  ecx
  jns  myLoop