Vlad
2015-06-05 12:59:52 UTC
Zde je kód smyčky, který se snažím pochopit jeho demontáž:
# include<stdio.h> # include <iostream>using namespace std; int main () {int i, arr [50], počet; printf ("\ nZadat počet prvků:"); cin >> num; // Načtení hodnot do pole printf ("\ nZadejte hodnoty:"); pro (i = 0; i < num; i ++) cin >> arr [i]; návrat 0;}
A toto je demontáž:
Můžete mi vysvětlit zvýrazněnou část? na co se používá Var_D8
? Proč se kompilátor posunul doleva edx
?
SHL EDX, 2 v zásadě vynásobí hodnotu EDX číslem 4.
@DominikAntal za jakým účelem?
Nejsem si jistý. Mám však podezření, že by to mohla být nějaká optimalizace / zarovnání kompilátoru pro pole. Můžete nám sdělit překladač a jeho parametry, které jste použili? Bude k dispozici instrukce SHL, pokud překompilujete tento kód tak, aby `ar` bylo bajtové pole? Můžete také připojit dynamický debugger (Ollydbg) a zjistit, co se děje přesně, krokováním kódu.
Klíčem k pochopení toho je `lea` opcode - eax získá * adresu *, nikoli * obsah *, této proměnné zásobníku. Toto je začátek vašeho pole. Protože celé číslo má na vašem počítači 4 bajty, čítač se vynásobí 4, což je stejné jako při levém posunutí o 2 - ale levý posun je u mnoha procesorů rychlejší, a proto je vybrán přes násobení.
@DominikAntal dev c ++