Halo semua , malam ini ane mau ngeshare say “Hello World!” dengan assembly ? oke , udah pada tau assembly belom ? kalo belom tau mari kita belajar assembly bareng bareng πŸ˜€

WTF is Assembly ?

A programming language that is once removed from a computer’s machine language. Machine languages consist entirely of numbers and are almost impossible for humans to read and write. Assembly languages have the same structure and set of commands as machine languages, but they enable a programmer to use names instead of numbers.

Oke dari sini ane kasih sedikit penjelasan , jadi menurut sayaΒ assembly adalah bahasa yang paling dekat dengan machine language . Tapi bedanya kalo assembly masih sedikit lebih manusiawi daripada machine language , bayangin aja coy ngetik 0 sama 1 bertubi tubi untuk melakukan sesuatu πŸ˜€ wkwkwkwk …..

Dan juga , yang saya mengerti kemarin , Bahasa assembly ini beda beda coy … tergantung Processor / CPU ente masing masing . Tapi yang global ada dua coy … apa itu ? Intel dan At&tΒ . Loh bedanya apa emang ? ada coy bedanya ane sebutin ya :

  • Baris komentar diawali dengan β€œ;” semicolon untuk NASM. AT&T mengawali komentar dengan # (hash)
  • Dalam format AT&T, setiap register diawali dengan %. NASM tidak menggunakan %.
  • Dalam format AT&T, setiap nilai literal (konstanta) diawali dengan $. NASM tidak menggunakan $.
  • Pada perintah yang menggunakan operand sumber dan tujuan, format AT&T menuliskan tujuan sebagai operand kedua (contoh: CMD <source>,<dest>). Sedangkan NASM menuliskan tujuan sebagai operand pertama (contoh: CMD <dest>,<source>).

Udah ngerti coy ? itu bedanya tuh di atas text ini πŸ˜€ Terus ada beberapa lagi macam macam registry terkait bahasa assembly ini coy … Ane coba copy dikit dari situs ilmuhacking.com ya πŸ™‚

Register

Register adalah variabel internal yang sudah built-in di dalam prosesor yang bisa dipakai oleh programmer untuk bermacam-macam keperluan. Karena register posisinya di prosesor, bukan di memory, maka menggunakan register sebagai variabel jauh lebih cepat dibanding menggunakan variabel yang dismipan di suatu alamat di memori.

Berikut adalah jenis-jenis register yang ada pada prosesor Intel.

Kategori Nama Penjelasan
General Purpose EAX, EBX, ECX, EDX Lebar data 32 bit, boleh diapakai untuk keperluan apa saja. E adalah Extended (karena awalnya register general purpose hanya 16 bit).
AX,BX,CX,DX 16 bit bawah dari register 32 bit di atas. AX adalah bagian 16 bit bawah dari EAX.
AH,AL,BH,BL,CH,CL,DH,DL Bagian 8 bit dari register 16 bit di atas . AH adalah 8 bit atas dari AX. AL adalah 8 bit bawah dari AX.
Segment Register CS, SS, DS, ES, FS, GS Digunakan untuk menunjuk 16 bit awal alamat memori. CS = Code, SS = Stack, DS = Data, ES,FS,GS = Extra segment register
Offset Register Digunakan untuk menunjuk 16 bit akhir alamat memori. Alamat memori ditunjukkan dengan gabungan segment dan offset.
EBP Dipakai sebagai offset frame dalam stack. Biasanya menunjuk pada bottom of stack frame di suatu fungsi. ESP menunjukkan puncak stack, EBP menunjuk dasar stack.
ESI Biasanya dipakai untuk offset string sumber dalam operasi yang melibatkan blok memori.
EDI Biasanya dipakai untuk offset string tujuan dalam operasi yang melibatkan blok memori.
ESP Stack pointer, menunjukkan puncak dari stack.
Special EFLAGS Tidak bisa dipakai programmer, hanya dipakai prosesor untuk hasil operasi logical dan state.
EIP Tidak bisa dipakai programmer, hanya dipakai prosesor untuk menunjukkan alamat memori yang berisi instruksi berikutnya yang akan dieksekusi.

Perhatikan gambar di bawah ini untuk melihat register-register yang ada dalam prosesor keluarga IA32 (Intel Architecture 32 bit).

Registry Intel 32bit

Dalam gambar di ats terlihat bahwa register-register Extended (berawalan E) adalah register 32 bit. Agar kompatibel program-program sebelumnya ketika register hanya ada 16 bit, maka register yang lain adalah bagian bit bawah dari versi extendednya. Contohnya adalah register ESI dan SI. Register SI adalah 16 bit paling bawah dari ESI. Pada register EAX, AX adalah 16 bit paling bawah dari EAX. Register AX pun dipecah lagi menjadi 8 bit atas AH dan 8 bit bawah AL. Programmer bebas menggunakan yang mana saja sesuai kebutuhannya.

Nahh itu sedikit kutipan dari ilmuhacking.com …. Itu dasar dasarnya coy . jadi beda antara 32 , 16 , dan 8 bit . Kalo 32 awalannya E , kalo 16 . itu A , kalo 8 itu *H dan *L

Oke , sekarang kita langsung menuju ke code “Hello World di assembly” :

[code]
; section text khusus buat code
section .text

global _start

_start:
; systemcall =&gt; write(1,msg,len)
mov edx,len ; panjang string dimasukkan dalam register EDX
mov ecx,msg ; alamat memori yang menyimpan string dimasukkan dalam register ECX
mov ebx,1 ; file descriptor (1=stdout=defaultnya console) disimpan dalam register EBX
mov eax,4 ; Nomor syscall 4 adalah fungsi sys_write()
int 0x80 ; panggil system call dengan interrupt 80 hexa.

; systemcall =&gt; exit(0)
xor ebx,ebx ; membuat EBX menjadi 0 sebagai return code ketika exit
mov eax,1 ; nomor syscall 1 adalah fungsi exit()
int 0x80 ; panggil system call dengan interrupt 80 hexa.

section .data ; section data khusus buat data/variable
msg db “Hello, World!”,0xa ; String diikuti dengan 0xA yaitu new line \n.
len equ $ – msg ; Panjang string didapat dengan mengurangi address di baris ini dengan alamat string.

[/code]

 

Nahh dari sana ane nangkepnya kaya gini coy , jadi kita harus nyiapin tempat dulu untuk setiap value di dalam registry , setelah nyiapin tempat (Note: ane nyebutnya deklarasi) terus kita lakuin prosedur untuk exit coy , dengan memanggil systemcall . Terus di section data kita lakukan pengisian value (Note: ane nyebut inisialisasi) jadinya begono πŸ˜€ hehehehe

 

Setelah dibaca codenya , di tulis coy simpen dengan extensionsΒ .asm , terus compile pake nasm atau apalah recommended pake linux πŸ˜€

[code]

nasm -f elf <filename>.asm

[/code]

Setelah proses diatas , akan menghasilkan file output berupa .o , ente harus ngompile lagi biar jadi executable file πŸ™‚

[code]

Jika pc ente 32 bit , pake command ini :

ld -s -o <filename> <filename>.o

JIka 64bit :

ld -m elf_i386 -s -o <filename> <filename>.o

[/code]

Hasilnya :

Hello World Output

Oke ane ngantuk coy , lanjut besok coy ya….. kalo ada pertanyaan atau ada yang salah komen aja coy . sesama manusia harus saling komen mengkomen hahahahaha :peace