assembly 无法访问程序集x86中的数组索引

yk9xbfzb  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(71)

我尝试在汇编中做等价于:

const array = ["ola", "mundo"]

for (i = 0; i < array.length; i++){
  console.log(array[i])
}

个字符
但是当我编译它时,每当我使用寄存器r8d访问索引时,它都会抛出一个错误:
nasm -f elf64 -o array.o array.asm
array.asm:22:错误:无效的操作数类型
第22行是mov ecx, array+r8d

3pmvbmvn

3pmvbmvn1#

但是当我编译它时,每当我使用寄存器r8d访问索引时,它都会抛出一个错误:
NASM无法通过mov ecx, array+r8d加载地址,因为r8d组件不是立即值,它是一个寄存器,其值仅在运行时可用。您可以使用LEA并写入lea rcx, [array + r8]。在寻址模式下使用整个qword寄存器。

array db "ola","mundo"

字符串
你的程序无法知道一个数组元素在哪里结束,下一个数组元素在哪里开始。你的程序所看到的只是一个8个字符的字符串“olamundo”。
一种解决方案可以像array db "ola", 0, "mundo", 0那样使用零终止。另一种解决方案可以像array db "ola ", "mundo "那样使用填充符来处理相同大小的字符串。还有一种解决方案可以用一个字节来表示数组元素的长度:

array db 3, "ola", 5, "mundo"
arrayLength equ $ - array


初稿:

main:
  mov   rsi, array
  mov   ebx, 1
.Loop:
  movzx edx, byte [rsi]  ; Load RDX with length byte
  inc   rsi              ; Make RSI point at current text string
  mov   rcx, rsi
  add   rsi, rdx         ; Now RSI points at next array element
  mov   eax, 4
  int   0x80
  mov   edx, 1
  mov   rcx, newline
  mov   eax, 4
  int   0x80
  cmp   rsi, array + arrayLength
  jb    .Loop

相关问题