Skip to content

Latest commit

 

History

History
executable file
·
95 lines (79 loc) · 3.59 KB

File metadata and controls

executable file
·
95 lines (79 loc) · 3.59 KB

Perulangan

For loop

Dibagian perulangan ini kita akan memulainya dari for-loop. Dalam bahasa C syntax for terdiri dari bagian init, condition, increment.

for ( init; condition; increment ) {
   statement(s);
}

Contoh kode C nya seperti ini.

#include <stdio.h>

int main(void)
{
    int i;
    for(i = 0; i < 5; i++)
    {
        printf("Hello world\n");
    }
}

Kita compile dan lihat hasil assemblynya.

$ gcc -o loop loop.c
$ gdb -batch -ex 'file loop' -ex 'disas main' 
Dump of assembler code for function main:
   0x00000000004004e7 <+0>:     push   rbp
   0x00000000004004e8 <+1>:     mov    rbp,rsp
   0x00000000004004eb <+4>:     sub    rsp,0x10
   0x00000000004004ef <+8>:     mov    DWORD PTR [rbp-0x4],0x0
   0x00000000004004f6 <+15>:    jmp    0x400508 <main+33>
   0x00000000004004f8 <+17>:    lea    rdi,[rip+0xa5]        # 0x4005a4
   0x00000000004004ff <+24>:    call   0x4003f0 <puts@plt>
   0x0000000000400504 <+29>:    add    DWORD PTR [rbp-0x4],0x1
   0x0000000000400508 <+33>:    cmp    DWORD PTR [rbp-0x4],0x4
   0x000000000040050c <+37>:    jle    0x4004f8 <main+17>
   0x000000000040050e <+39>:    mov    eax,0x0
   0x0000000000400513 <+44>:    leave  
   0x0000000000400514 <+45>:    ret    
End of assembler dump.

Pada main+8 itu merupakan bagian dari statement for loop yang biasa disebut init. Dalam bahasa C, bagian init akan dieksekusi lebih dulu, karena bagian init akan menginisialisasi variable yang digunakan sebagai pengontrol loop. Dalam kasus ini variable i akan menjadi pengontrol loop, ia akan diinisialisasi dengan 0.

Selanjutnya pada main+15 ada instruksi jmp 0x400508, eksekusi akan loncat ke main+33. Sekarang kita lihat instruksi pada main+33. Disana nilai yang berada di [rbp-0x4] akan dibandingkan dengan nilai 0x4. Di instruksi selanjutnya program akan loncat lagi ke main+17 jika nilai yang dibandingkan sebelumnya kurang dari atau sama dengan 0x4.

Pada main+17 sampai main+24 itu adalah kode kita yang berada didalam blok for. Didalam blok for kita akan mencetak string "Hello world".

Pada main+29, variable i akan ditambah 1.

While loop

Dalam bahasa C statement while loop biasanya ditulis seperti berikut.

#include <stdio.h>

int main(void)
{
    int i = 0;
    while(i < 5)
    {
        printf("Hello world\n");
        i++;
    }
}

Compile dan lihat hasil assemblynya.

$ gcc -o while while.c
$ gdb -batch -ex 'file while' -ex 'disas main'
Dump of assembler code for function main:
   0x00000000004004e7 <+0>:     push   rbp
   0x00000000004004e8 <+1>:     mov    rbp,rsp
   0x00000000004004eb <+4>:     sub    rsp,0x10
   0x00000000004004ef <+8>:     mov    DWORD PTR [rbp-0x4],0x0
   0x00000000004004f6 <+15>:    jmp    0x400508 <main+33>
   0x00000000004004f8 <+17>:    lea    rdi,[rip+0xa5]        # 0x4005a4
   0x00000000004004ff <+24>:    call   0x4003f0 <puts@plt>
   0x0000000000400504 <+29>:    add    DWORD PTR [rbp-0x4],0x1
   0x0000000000400508 <+33>:    cmp    DWORD PTR [rbp-0x4],0x4
   0x000000000040050c <+37>:    jle    0x4004f8 <main+17>
   0x000000000040050e <+39>:    mov    eax,0x0
   0x0000000000400513 <+44>:    leave  
   0x0000000000400514 <+45>:    ret    
End of assembler dump.

Pada main+8 kita isi variable i dengan 0. Pada main+15 program akan loncat ke alamat 0x400508, disana terdapat instruksi cmp yang membandingkan variable i dengan nilai 0x4. Setelah itu terdapat instruksi jle yang akan loncat ke alamat 0x4004f8 jika nilai yang dibandingkan sebelumnya kurang dari atau sama dengan 4 (sesuai instruksi cmp sebelumnya). Di alamat 0x4004f8 program akan mencetak hello world dan mengincrement variable i.