Я сравниваю два массива в ассемблерных символах, код 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 - внешние и определены вC как "char массив1 [вектор]".В моем понимании, array1 [i] имеет длину 16 бит, потому что это массив символов, а символ int == 16 бит.Из-за этого сначала я попытался работать с полными 64-битными регистрами, например:
cmp rdx, rax
И код не работает, если я использую 64-битные регистры (нулевой бит не установлен, поэтому jne срабатывает, и еслизаканчивается), это работает только тогда, когда я использую al и dl (8 lsb), и я хочу понять, почему.
Сравнение 8 lsb не проблема, так как arrayX [i] никогда не будет вышечем 2 ^ 8, но выполнение cmp rax, rdx и cmp al, dl должно иметь тот же эффект.