məclis dilində dəyişən necə elan ediləcək


cavab 1:

Tutaq ki, iki funksiya yazmısan:

int main () { int a = 10; qayıt biraz (a);}

int a = 10;int main () { qayıt biraz (a);}

Birinci funksiyada “a” lokal dəyişəndir, yəni “main” xaricindəki heç kimin onu oxuya bilməməsi deməkdir (göstəricilər kimi şeylər var, amma bu başqa bir müzakirədir).

"A" yerli bir dəyişən olduğundan, onu qoymaq üçün ən yaxşı yer yığının üzərində olardı. Bu səbəbdən “a” dəyişkənliyi yığının ofsetinə çevriləcəkdir.

; ...alt esp, 0x18; Dəyişənlərimiz üçün 0x18 bayt yığın boşluğuna ehtiyacımız varmov dword [esp + 4], 10esp əlavə edin, 0x18; ...

Bu vəziyyətdə “a” dəyişəninə, ola biləcəyi yerdə “esp + 4” yaddaş ünvanı verilir.

Lakin işləri daha sürətli etmək üçün tərtibçi sadəcə “a” -nın qeyd olduğunu düşünə bilər.

mov eax, 10

İkincisi bir az fərqlidir. "A" qlobal bir dəyişən olduğundan, bu, xüsusi bir işləmə tələb edir. Ümumiyyətlə, bir kompilyator onu yaddaş ünvanı kimi qoyur.

; C tərtibçisi tərəfindən yaradılan "init_variables" funksiyasındamov dword [0x123456], 10; İndi "ana" da ...mov eax, [0x123456]

Bu vəziyyətdə 0x123456, “a” dəyişəninin yerləşməsidir. Əlbətdə ki, kompilyator işlərini sürətləndirmək üçün qlobal dəyişəni bir qeyd daxilində saxlamaq istəyə bilər.

Sökməyə baxarkən, xüsusən massivlərə və göstəricilərə baxarkən hansı dəyişənin hansı ünvanla getdiyini izini itirmək çox asandır. İnsanlar IDA Pro və HexRays kimi sökücülərə bu qədər pul xərcləmələrinin səbəbi budur - çünki yaddaşları təhlil etmək və axını idarə etmək üçün güclü alətlər təqdim edirlər və yaddaş yerlərini işarələmək üçün sizə müxtəlif seçimlər verirlər və s.


cavab 2:

Montajda heç bir dəyişən yoxdur.

Yığında yaddaş yerləri və ya yerlər var və bunlar içərisində olan dəyərlər var.

Həddindən artıq sadələşdirmə - istənilən vaxt CPU dəyişənlə işləməli olur:

  • ünvanını almaq lazımdır
  • həmin ünvanda saxlanan dəyəri bir reyestrə oxuyun
  • reyestrdəki dəyər üzrə işləyin
  • qeyddəki dəyəri yenidən həmin ünvanda yaddaşa yazın

Nümunəniz int a = 10 kimi bir şey olacaq

DW? ; dəyişən A üçün saxlama təyin edin... LD DX, A; A ünvanını alın, DX-də saxlayınMOV AX, 10; qeyd registri AX = 10MOV [DX], AX; içərisində AX dəyərini saxlayın; yaddaş DX tərəfindən göstərildi...

(Sintaksis yoxlamışam və yığıncım paslıdır - əvvəlcədən ayrılmış dəyişən əvəzinə yığını istifadə edərdiniz - ancaq bunun mahiyyəti budur)