Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Ilkin variant
- void main(){
- int x=0;
- int y=x++;
- printf("x = %d and y = %d",x,y);
- }
- [root@picadapter ~]# ./test
- x = 1 and y = 0
- 0x0000000000400530 <+0>: push rbp
- 0x0000000000400531 <+1>: mov rbp,rsp
- 0x0000000000400534 <+4>: sub rsp,0x10
- 0x0000000000400538 <+8>: mov DWORD PTR [rbp-0x4],0x0 < ====== 'x = 0'
- 0x000000000040053f <+15>: mov eax,DWORD PTR [rbp-0x4]
- 0x0000000000400542 <+18>: lea edx,[rax+0x1]
- 0x0000000000400545 <+21>: mov DWORD PTR [rbp-0x4],edx
- 0x0000000000400548 <+24>: mov DWORD PTR [rbp-0x8],eax
- 0x000000000040054b <+27>: mov edx,DWORD PTR [rbp-0x8]
- 0x000000000040054e <+30>: mov eax,DWORD PTR [rbp-0x4]
- 0x0000000000400551 <+33>: mov esi,eax
- 0x0000000000400553 <+35>: mov edi,0x400600
- 0x0000000000400558 <+40>: mov eax,0x0
- 0x000000000040055d <+45>: call 0x400410 <printf@plt>
- 0x0000000000400562 <+50>: leave
- 0x0000000000400563 <+51>: ret
- movement instruction ~~~~ int x = 0;
- 0x0000000000400538 <+8>: mov DWORD PTR [rbp-0x4],0x0
- (gdb) x/x $rbp-0x4
- 0x7fffffffe56c: 0x00000000
- 0x000000000040053f <+15>: mov eax,DWORD PTR [rbp-0x4]
- => 0x0000000000400542 <+18>: lea edx,[rax+0x1]
- rbp-0x4 = bu addressing modedan sonra adresdeki deyer yeni 0 movement edilir eax registerine
- ardiyca lea (load effective address) rax registerinin uzerine yeni 0-in uzerine 1 deyerini gelir edx = rax+1; psuevdokod bu sekilde olur ve bu deyeri yeni 1i load edir edx registerine yeni x = 1; (x deyeri edx registeri olaraq istifade edilir). edx = 1; baxaq
- (gdb) print /x $edx
- $1 = 0x1
- x = 1 :))
- indi y deyerinin addresine baxaq
- (gdb) x/x 0x7fffffffe56c
- 0x7fffffffe56c: 0x00000000
- y deyerinin addressi helede 0-dir; hecbir deyishiklik yoxdur:)// increment operatorunun priority precedence-e sahib deyildi.
- Kecek ikinci example-a
- #include <stdio.h>
- #include <string.h>
- void main(){
- int x=0;
- int y=++x;
- printf("x = %d and y = %d",x,y);
- }
- [root@picadapter ~]# ./test
- x = 1 and y = 1
- 0x0000000000400538 <+8>: mov DWORD PTR [rbp-0x4],0x0
- 0x000000000040053f <+15>: add DWORD PTR [rbp-0x4],0x1
- yeniden baxaq demeli rbp-0x4 direktivi ile addresslenmis memory-e 0 deyeri teyin edilir.
- 0x0000000000400538 <+8>: mov DWORD PTR [rbp-0x4],0x0
- (gdb) x/x $rbp-0x4 (bu address y deyiseninin adresidir)
- 0x7fffffffe56c: 0x00000000
- ardiyca y adresine
- add DWORD PTR [rbp-0x4],0x1 ;bu instruction vasitesi ile o addressdeki deyere yeni 0-a +1 elave edilir;
- burda y deyiseninin deyeri olur 1 baxaq;
- (gdb) x/x $rbp-0x4
- 0x7fffffffe56c: 0x00000001 < === y = 1;
- kecek x deyiseninin adresine ; daha sonra
- 0x0000000000400543 <+19>: mov eax,DWORD PTR [rbp-0x4] < ==== 1 deyeri elave edilir eax registerine
- => 0x0000000000400546 <+22>: mov DWORD PTR [rbp-0x8],eax < ==== bu eax deyeri yeni 1 yerlesdirilir x deyiseninin adresine ardiyca x deyeride olur 1;
- (gdb) x/x $rbp-0x8
- 0x7fffffffe568: 0x00000000 < === x deyiseni hal hazirda 0di mov DWORD PTR [rbp-0x8],eax bu direktivden sonra 1 deyerini alacaq.
- (gdb) x/x $rbp-0x8
- 0x7fffffffe568: 0x00000001
- bu halda x ve y 1 deyerini alir cunki burd ++rax increment operatorunun precedence prioriteti movcuddur. Ona gorede birbasa 2 memory addressede effektiv addressleme ede bilir.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement