我尝试在汇编中做等价于:
const array = ["ola", "mundo"] for (i = 0; i < array.length; i++){ console.log(array[i]) }
个字符但是当我编译它时,每当我使用寄存器r8d访问索引时,它都会抛出一个错误:nasm -f elf64 -o array.o array.asmarray.asm:22:错误:无效的操作数类型第22行是mov ecx, array+r8d。
r8d
mov ecx, array+r8d
3pmvbmvn1#
但是当我编译它时,每当我使用寄存器r8d访问索引时,它都会抛出一个错误:NASM无法通过mov ecx, array+r8d加载地址,因为r8d组件不是立即值,它是一个寄存器,其值仅在运行时可用。您可以使用LEA并写入lea rcx, [array + r8]。在寻址模式下使用整个qword寄存器。
lea rcx, [array + r8]
array db "ola","mundo"
字符串你的程序无法知道一个数组元素在哪里结束,下一个数组元素在哪里开始。你的程序所看到的只是一个8个字符的字符串“olamundo”。一种解决方案可以像array db "ola", 0, "mundo", 0那样使用零终止。另一种解决方案可以像array db "ola ", "mundo "那样使用填充符来处理相同大小的字符串。还有一种解决方案可以用一个字节来表示数组元素的长度:
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
型
1条答案
按热度按时间3pmvbmvn1#
但是当我编译它时,每当我使用寄存器
r8d
访问索引时,它都会抛出一个错误:NASM无法通过
mov ecx, array+r8d
加载地址,因为r8d
组件不是立即值,它是一个寄存器,其值仅在运行时可用。您可以使用LEA并写入lea rcx, [array + r8]
。在寻址模式下使用整个qword寄存器。字符串
你的程序无法知道一个数组元素在哪里结束,下一个数组元素在哪里开始。你的程序所看到的只是一个8个字符的字符串“olamundo”。
一种解决方案可以像
array db "ola", 0, "mundo", 0
那样使用零终止。另一种解决方案可以像array db "ola ", "mundo "
那样使用填充符来处理相同大小的字符串。还有一种解决方案可以用一个字节来表示数组元素的长度:型
初稿:
型