Skip to content

Latest commit

 

History

History
executable file
·
73 lines (61 loc) · 2.63 KB

File metadata and controls

executable file
·
73 lines (61 loc) · 2.63 KB

Operasi Aritmatika

Sekarang kita akan mempelajari bagaimana operasi artimatika dalam bahasa C jika ditranslate ke dalam bahasa assembly. Saya mempunyai contoh program seperti berikut,

#include <stdio.h>

int main(void)
{
    int x = 10;
    int y = 10;
    int z = x + y;
    return 0;
}

Sekarang kita compile dan lihat hasil assemblynya.

$ gcc -o arith arith.c 
$ gdb -batch -ex 'file arith' -ex 'disas main'
Dump of assembler code for function main:
   0x0000000000400497 <+0>:     push   rbp
   0x0000000000400498 <+1>:     mov    rbp,rsp
   0x000000000040049b <+4>:     mov    DWORD PTR [rbp-0x4],0xa
   0x00000000004004a2 <+11>:    mov    DWORD PTR [rbp-0x8],0xa
   0x00000000004004a9 <+18>:    mov    edx,DWORD PTR [rbp-0x4]
   0x00000000004004ac <+21>:    mov    eax,DWORD PTR [rbp-0x8]
   0x00000000004004af <+24>:    add    eax,edx
   0x00000000004004b1 <+26>:    mov    DWORD PTR [rbp-0xc],eax
   0x00000000004004b4 <+29>:    mov    eax,0x0
   0x00000000004004b9 <+34>:    pop    rbp
   0x00000000004004ba <+35>:    ret    
End of assembler dump.

Perhatikan kode assembly diatas, diinstruksi main+4 dan main+11 menunjukkan bahwa variable x disimpan di [rbp+0x4] dan variable y disimpan di [rbp+0x8]. setelah itu, variable x akan disimpan di register edx, dan variable y akan disimpan di variable eax, dilanjutkan dengan instruksi add eax, edx untuk melakukan operasi pertambahan. Hasil dari pertambahan akan tersimpan di register eax, dan register eax akan disimpan di lokasi [rbp-0xc] untuk mengisi variable z.

Sekarang kita ganti operasi pertambahan dengan perkalian, jadi kodenya seperti ini

#include <stdio.h>

int main(void)
{
    int x = 10;
    int y = 10;
    int z = x * y;
    return 0;
}

Compile.

$ gcc -o arith arith.c
$ gdb -batch -ex 'file arith' -ex 'disas main'
Dump of assembler code for function main:
   0x0000000000400497 <+0>:     push   rbp
   0x0000000000400498 <+1>:     mov    rbp,rsp
   0x000000000040049b <+4>:     mov    DWORD PTR [rbp-0x4],0xa
   0x00000000004004a2 <+11>:    mov    DWORD PTR [rbp-0x8],0xa
   0x00000000004004a9 <+18>:    mov    eax,DWORD PTR [rbp-0x4]
   0x00000000004004ac <+21>:    imul   eax,DWORD PTR [rbp-0x8]
   0x00000000004004b0 <+25>:    mov    DWORD PTR [rbp-0xc],eax
   0x00000000004004b3 <+28>:    mov    eax,0x0
   0x00000000004004b8 <+33>:    pop    rbp
   0x00000000004004b9 <+34>:    ret    
End of assembler dump.

Perbedaan dari output assembly ini dari yang sebelumnya hanya berada apa instruksi imul, imul adalah instruksi assembly untuk melakukan operasi perkalian.

Kalian bisa bereksperimen dengan operator-operator lain, seperti pengurangan, xor atau yang lain.