Saya baru membaca Majelis, tetapi saya pikir saya paling mengerti cara kerja instruksi Majelis. Inilah fungsi yang membuat saya bingung:

mov  ecx, dword [ecx + 0x28]
mov  eax, dword [esp + 0x04]
and  ecx, eax
xor  edx, edx
cmp  ecx, eax
sete dl
mov  eax, edx
ret  4

Saya percaya ini diterjemahkan secara kasar ke pseudocode berikut:

let ecx = <read memory at ecx+0x28>
let eax = <read from stack at 0x04, probably function argument>
ecx = ecx + eax;
if (ecx == eax) {
  return 1;
} else {
  return 0;
}

Jadi satu-satunya cara agar ecx sama dengan eax setelah menambahkan adalah jika ecx == 0, dan memuat eax dan menambahkan terlihat sama sekali tidak perlu. Apa yang kulewatkan di sini? Apa yang bisa menjadi tujuan dari operasi tambahan itu?

1
Rogach 8 Agustus 2019, 12:32

1 menjawab

Jawaban Terbaik

Itu and bukan add.

x & mask == mask adalah idiom standar untuk memeriksa bahwa semua bit dalam mask disetel dalam x.

and ecx, eax saja (atau test ecx, eax) akan menghapus ZF jika setidaknya satu bit disetel, jadi Anda tidak dapat membedakan antara itu dan semua bit.


Juga, karena asm tidak bercabang menggunakan xor/cmp/setcc, transliterasi yang lebih dekat ke C akan menjadi return (x & mask) == mask; bukan if/else. Xor-zero mungkin hanya untuk menghindari ketergantungan palsu, tetapi jika itu dari dentang maka itu karena nilai yang dikembalikan adalah int, bukan bool.

4
Peter Cordes 8 Agustus 2019, 10:51