【发布时间】:2019-04-12 15:57:19
【问题描述】:
我正在逐个字符比较汇编中的两个数组,C 代码将是这样的:
count=0;
for (i=0;i<vector;i++) {
if (array1[i]==array2[i]) {
count++;
}
}
基本上,两个数组都会进行比较,当该位置的字符相同时,计数会增加。
我最终在汇编中得到了这段代码,它实际上似乎按预期工作:
forEachVector:
cmp bl, vector
jge endforEachVector
mov rax, QWORD[array1+rbx] ; move array[i] to rax
mov rdx, QWORD[array2+rbx] ; move array[i] to rdx
if1Equals2:
cmp dl, al
jne fi1Equals2
inc cl
fi1Equals2:
inc bl
jmp forEachVector
endforEachVector:
vector 是一个常量,array1 和 2 是 extern,在 C 中定义为“char array1[vector]”。 据我了解,array1[i] 是 16 位长,因为它是一个 char 数组,而 char 是一个 int == 16 位。因此,首先我尝试使用完整的 64 位寄存器进行操作,就像:
cmp rdx, rax
如果我使用 64 位寄存器(未设置零位,因此触发 jne 并且如果结束),代码将失败,它仅在我使用 al 和 dl (8 lsb) 并且我想了解原因时才有效。
比较 8 lsb 没问题,因为 arrayX[i] 永远不会高于 2^8,但是做 cmp rax, rdx 和 cmp al, dl 应该有同样的效果。
【问题讨论】:
-
好的,c 字符串存储 8 位值,而不是 16 位。宽数组或 UTF 或其他可能会有所不同,但标准 C 字符串是 8 位的,因此您的比较有效。
-
这是一个确保我们相互理解的神器:godbolt.org/z/nvye_k