Otázka:
Porozumění demontáži smyčky
Vlad
2015-06-05 12:59:52 UTC
view on stackexchange narkive permalink

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áž: enter image description here

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 ++
Dva odpovědi:
Spl3en
2015-06-05 14:19:29 UTC
view on stackexchange narkive permalink

var_D8 je váš int arr [50] .

Můžete jej rychle poznat pouze podle názvu: 50 * sizeof (int) = 200 = 0xC8. Další proměnnou v zásobníku je numb_of_elements , která je umístěna na -0x10 v zásobníku, takže máme nějakou paměť mezi -0xD8 a -0x10, která odpovídá poli int .

Zde je několik vysvětlení k následujícím pokynům:

  lea eax, [ebp + var_D8]; Získejte adresu prvního prvku pole. Mov edx, [ebp + Counter]; Získejte aktuální prvek index.shl edx, 2; Jelikož velikost každého prvku pole je 4, vynásobte index 4add eax, edx; &arr [i] = Adresa aktuálního prvkumov [esp], eax; Přesuňte jej do zásobníku, aby jej mohl zapsat std :: cin  
Skvělé vysvětlení, K čemu se používá dalších 16 bitů mezi hodnotami „0x10“ a „0xD8“?
@Vlad: co 16 bitů? Prohlášení, které vám možná bude muset připomenout, že zde není žádná hodnota v „bitech“ - ale možná jste si to zaměnili s * bajty *. Přesto: jak jste dospěli k závěru, že mezi `0x10` a` 0xD8` zbývá * ještě * další prostor? Tento prostor je ** přesně ** množství potřebné pro 50 celých čísel, o kterých váš původní kód říká, že by měly být, nic víc a nic méně.
Ta Thanh Dinh
2015-06-05 14:10:55 UTC
view on stackexchange narkive permalink

var_d8 je základní pozice arr v zásobníku, velikost typu int ve vašem zařízení je 4 , takže pozice arr [i] v zásobníku se vypočítá podle:

var_d8 + 4 * i



Tyto otázky a odpovědi byly automaticky přeloženy z anglického jazyka.Původní obsah je k dispozici na webu stackexchange, za který děkujeme za licenci cc by-sa 3.0, pod kterou je distribuován.
Loading...