RSS

Senin, 08 Maret 2010

Bahasa Rakitan/Assembly

BAB I

PENGENALAN ASSEMBLY

Apakah Sebenarnya Bahasa Assembly itu?

Bahasa Assembly (Assembler atau bahasa Rakitan) adalah merupakan salah satu dari sekian banyak bahasa pemrograman yang tergolong dalam Bahasa Pemrogaman Tingkat Rendah (Low Level Language) dan hanya setingkat diatas bahasa mesin (Machine Language).

  • Komputer “bicara/berkomunikasi” dgn menggunakan suatu bahasa
  • Bahasa-bahasa pemrograman menyediakan tools u/ mengekspresikan pemrosesan data secara simbolik
  • Setiap bahasa memiliki sintaks dan grammar yang dirumuskan dgn baik
  • Bahasa Assembler/Rakitan adalah bahasa komputer yang mempunyai kedudukan diantara bahasa tingkat tinggi dan bahasa tingkat rendah dan bertugas mengkonversi program source kode ke bahasa mesin.

Bahasa Assembly merupakan representasi teks dari bahasa mesin
Satu statement bahasa rakitan merepresentasikan satu instruksi mesin
Bahasa rakitan merupakan abstarksi antara program tingkat tinggi dan kode mesin

  • Bahasa Tingkat Tinggi/High Level Language adalah bahasa komputer yang menggunakan kata-kata dan pernyataan yang mudah dimengerti oleh manusia, walaupun jauh berbeda dengan bahasa yang digunakan untuk komunikasi sehari-hari. Contoh Java, C++, Pascal, Basic dll
  • Bahasa Tingkat Rendah/Low Level Language/Bahasa Mesin adalah kumpulan kode biner yang hanya bisa di mengerti oleh komputer, kode-kode ini kemudian diterjemahkan sebagai instruksi-instruksi yang harus dijalankan oleh komputer.
  • Bahasa mesin merupakan bahasa ibu/alamiah dari computer
  • Bahasa mesin merupakan representasi bit dari operasi mesin dieksekusi oleh hardware
  • Hirarki bahasa pemrograman:

Mengapa Assembly?

Mengetahui lebih dalam tentang arsitektur komputer dan sistem operasi, Mengetahui lebih lanjut tentang komputer dan bagaimana bahasa komputer membangkitkan kode mesin, karena bahasa Assembly mempunyai hubungan yang dekat dgn bahasa mesin. Tipe pemrogramman tertentu sulit atau tidak mungkin dilakukan dgn bhs tingkat tinggi. Contoh:

1. Komunikasi langsung dgn SO komputer

2. Program color high-speed graphics dgn memori rendah

3. Program interfacing

4. Program telekomunikasi

Sebagai Solusi akibat batasan-batasan pada bhs tingkat tinggi.

Sebagai alat belajar (learning tool) .. terutama menyakut kerja OS

Assembly memiliki kelebihan yang tidak dapat digantikan oleh bahasa pemrogaman manapun. Diantaranya adalah :

- Hasil program memiliki tingkat kecepatan yang tinggi.

- Ukuran dari program kecil.

- Sangat mudah untuk mengakses Sistem Komputer.

Apakah Segment dan Offset itu?

Segment dan Offset merupakan suatu angka 16 bit (direpresntasikan dalam bilangan hexa) yang menunjukkan suatu alamat tertentu di memory komputer. Pasangan segment : offset ini disebut juga alamat relatif. Selain alamat relatif, terdapat juga alamat mutlak berupa angka 20 bit (juga direpresentasikan dalam bilangan hexa). Alamat mutlak ini dapat dihitung dengan mengalikan segment dengan 10 hexa dan ditambahkan dengan offset.

Contoh : segment : offset

0100 : 1234

Alamat relatifnya adalah : 02234

Apakah Interrupt itu?

Interrupt adalah permintaan kepada microprocessor untuk melakukan suatu perintah. Ketika terjadi permintaan interupsi, microprocessor akan mengeksekusi interrupt handler , yaitu suatu program yang melayani interupsi. Setitap interrupt handler itu memiliki alamat masing – masing yang disimpan dalam bentuk array yang masing – masing terdiri dari 4 byte (2 offset dan 2 segment). Array ini disebut vektor interupsi . Vektor interupsi ini disusun berdasarkan nomor interupsi yaitu dari hexa. Selain itu, dikenal juga istilah service dan subservice, maksudnya adalah bahwa setiap interrupt itu dibagi menjadi beberapa bagian yang mempunyai tugas masing – masing. Tetapi ada juga interrupt yang tidak memiliki service, contohnya int 29.

Apakah Register itu?

Register adalah merupakan sebagian memory dari microprocessor yang neniliki kecepatan sangat tinggi. Dapat juga dianalogikan bahwa register merupakan kaki tangan dari microprocessor.

Dan juga 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.

Register dibagi menjadi lima bagian besar yaitu :

· Segment Register (16 bit)

Register untuk menunjukkan alamat dari suatu segment. Yang termasuk register segment :

ü . CS (Code Segment)

Menunjukkan alamat segment dari program yang sedang aktif.

ü . DS (Data Segment)

Menunjukkan alamat segment dari data program (variabel).

ü . SS (Stack Segment)

Menunjukkan alamat segment dari stack yang digunakan program.

ü . ES (Extra Segment)

Merupakan register segment cadangan.

· Pointer dan Index Register (16 bit) Register untuk menunjukkan alamat dari suatu offset.

Yang termasuk register pointer dan index :

ü . SP (Stack Pointer)

Berpasangan dengan SS (SS : SP).

ü . BP (Base Pointer)

Berpasangan dengan SS (SS : BP).

ü . DI (Destination Index)

Berpasangan dengan ES (ES : DI). Dipakai untuk operasi string.

ü . SI (Source Index)

Berpasangna dengan DS (DS : SI). Dipakai untuk operasi string.

· General Purpose Register (16 bit)

Register ini dapat digunakan untuk berbagai keperluan, tetapi masing – masing juga memiliki fungsi khusus. Jenis register ini memiliki ciri khas, yaitu dapat dibagi lagi menjadi register 8 bit, register tinggi/high, dan register rendah/low.

Yang termasuk register general purpose :

ü . AX –> AH|AL (Accumulator)

Untuk menangani operasi arithmatika.

ü . BX –> BH|BL (Base)

Untuk menunjukkan alamat offset.

ü . CX –> CH|CL (Counter)

Untuk looping, menunjukkan berapa kali looping terjadi.

ü . DX –> DH|DL (Data)

Untuk menampung sisa pembagian bilangan 16 bit.

· Index Pointer Register (16 bit)

Hanya terdiri dari 1 register yaitu IP yang berpasangan dengan reguster CS (CS : IP) untuk menunjukkan alamat instruksi selanjutnya yang akan dieksekusi.

· Flags Register (1 bit)

Register ini berfungsi untuk menunjukkan suatu kondisi (ya atau tidak).

Register ini hanya bernilai 0 dan 1.

Yang termasuk register flags :

ü . OF (Overflow Flag) 1 jika terjadi overflow

ü . SF (Sign Flag) 1 jika digunakan bilangan bertanda

ü . ZF (Zero Flag) 1 jika hasil operasi bernilai 0

ü . CF (Carry Flag) 1 jika operasi menghasilkan carry

ü . PF (Parity Flag) 1 jika hasil operasi bilangan genap

ü . DF (Direction Flag) 1 jika alur proses alur proses menurun pada string

ü . IF (Interrupt Flag) 1 jika proses dapat diinterupsi

ü . TF (Trap Flag) 1 jika dapat ditrace / debug

ü . AF (Auxiliary Flag) digunakan pada operasi bilangan BCD

ü . NT (Nested Task) digunakan untuk menangani interupsi beruntun

ü . IOPL (I/O Protection Level) digunakan untuk mode proteksi (2 bit)

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)

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.

Bagaimana memulai Assembly?

Bahasa assembly tidak seperti bahasa tingkat tinggi (High Level Language) yang biasanya memiliki IDE – Integrated Development Environment, bahasa assembly dapat diketikkan dalam berbagai macam editor teks, misalnya BC, TC, TURBO, NOTEPAD, EDIT, dan editor teks lainnya. Yang perlu diingat bahwa ekstensi dari program assembly haruslah .ASM. Setelah program assembly diketikkan dan disimpan dengan ekstensi .ASM, maka program tersebut harus dikompilasi menjadi Object File berekstensi .OBJ, dan kemudian harus dilink menjadi executable file (.EXE/.COM), executable file inilah yang baru dapat dijalankan.

Untuk mengcompile : C:\TASM

Untuk melink : C:\LINK

C:\Option /t untuk melink file ke .COM

C:\Untuk melink menjadi .EXE, hilangkan option /t ini.

atau pake cara langsung :

Perbedaan program .COM dan .EXE adalah :

Program .COM Program .EXE

- Hanya menggunakan 1 segment untuk º – Menggunakan banyak segment.

- code, data, dan stack. º

- Ukuran program relatif kecil º – Ukuran program relatif besar

- Hasil program lebih cepat º – Hasil program lebih lambat

- Hanya dapat menangani program kecil º – Dapat menangani program yang besar(<=64 KByte).

Bagaimana Struktur bahasa Assembly?

Struktur dasar bahasa Assemblymemiliki 3 komponen dalam mesin Intel dan 4 komponen dalam mesin MIPS:

1. Label/ Nama proses atau operasi

· Bagian label berfungsi mewakili nomor memori program

· Apabila ada perintah JUMP(lompat)ke suatu label maka Assembler akan mengingat nomor memori program yang dimaksud dan menjalankan instruksi-instruksi yang terdapat didalam label tersebut

· Cara penulisan Label, bebas tetapi tidak boleh ada spasi, tidak boleh ada nama label yang sama dan diakhiri tanda titik dua( : )

2. Mnemonic

· Mnemonik merupakan kode alphabet pendek atau singkatan perintah yang mudah diingat

· Bagian ini bertugas menginstruksikan suatu program untuk bekerja sesuai perintah

· Mnemonik terdiri dari dua macam yaitu

1. Instruksi => instruksi pengendali prosessor misalnya MOV, ADD, JMP

2. Directive => Pengatur kerja program Assembler misal DB, DW,DD

# Penulisan harus huruf kapital semua atau huruf kecil semua

3. Operand 1

· Operand merupakan objek dari sebuah instruksi yang harus

· dieksekusi oleh program assembler sesuai perintah pada bagian Mnemonic

· Bagian ini bisa berupa register, variabel memory, label atau Immediate value

• Contoh

· AX (register)

· count (variabel memory)

· JMP Mulai (label:lompat ke label Mulai)

· 10 (immediete value)

# Penulisan harus huruf kapital semua atau huruf kecil semua

4. Operand 2 (mesin MIPS)

· Komentar

1. Bagian Komentar tidak berpengaruh dengan jalannya program, tetapi sangat pentung untuk mempermudah seseorang mengerti maksud dari program yang di buat

2. Cara penulisan bebas dan harus didahului tanda titk koma (;) pada mesin intel dan # pada mesin MIPS

Struktur Program .COM?

Untuk .COM dan .EXE memiliki struktur program yang berbeda, untuk kesempatan

ini hanya akan dibahas struktur program .COM.

Berikut ini struktur program .COM (tanda ; adalah untuk komentar) :

nama_segment segment ; nama_segment diisi terserah anda; Baris ini untuk memberikan nama sebuah segment

assume cs : nama_segment ; Menunjukkan CS ke segment yang sudah kita beri nama
org 100h ; Untuk PSP – Program Segment Prefix; PSP ini digunakan untuk berhubungan dengan DOS

label_pertama : ; Di Assembly, minimal harus ada satu label; penamaan label terserah anda

mov ah,04ch ; service

int 21h ; int 21h service 04ch merupakan instruksi untuk; keluar dari program
nama_segment ends ; Akhir dari sebuah segment end label_pertama ; Label yang paling pertama harus ditutup dengan perintah ini

ü Bagaimana Variabel dalam Assembly?
Dalam assembly dikenal beberapa jenis data, yaitu :
- db (define byte) –> Besarnya 1 byte (0h – FFh)

- dw (define word) –> Besarnya 2 byte (0h – FFFFh)

- dd (define double word) –> Besarnya 4 byte (0h – FFFFFFFFh)

- df (define far word) –> Besarnya 6 byte (0h – FFFFFFFFFFFFh)

- dq (define quad word) –> Besarnya 8 byte (0h – FFFFFFFFFFFFFFFFh)

- dt (define temp word) –> Besarnya 10 byte (0h – FFFFFFFFFFFFFFFFFFFFh)

ü INT, MOV, JMP, dan LEA

INT adalah perintah untuk melaksanakan suatu interupsi.

Syntaxnya adalah : INT no_interupsi

Contoh : INT 20h ; untuk program terminate

mOV adalah perintah untuk mengisi nilai ke register, variabel, atau alamat memory tertentu.

Syntaxnya adalah :MOV destination,source

Contoh : MOV AX,5 ; nilai AX akan berisi 5

JMP adalah perintah untuk melakukan lomptan ke label tertentu.

Syntaxnya adalah : JMP nama_label

Contoh : JMP label1 ; Program akan melompat ke label1

LEA adalah perintah untuk mendapatkan alamat dari sebuah variabel.

Syntaxnya adalah : LEA variable

Contoh : lea si,bil1 ; si akan berisi offset bil1

Contoh kecil menampilkan teks “Hello World”

; section text khusus buat code

section .text

global _start

_start:

; systemcall => 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 => 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.

Setelah itu compile file ASM itu menjadi object code berformat ELF dengan NASM (netwide assembler). Setelah itu akan terbentuk file hello.o yang harus dilink dengan linker LD agar menjadi format executable.

$ nasm -f elf hello.asm
$ ld -s -o hello hello.o
$ ./hello
Hello, World!

Program di atas sangat sederhana, kita memanggil system call write() untuk menampilkan string (msg), kemudian kita memanggil system call exit() untuk keluar dari program dan program selesai. String msg kita taruh dalam section .data karena section tersebut khusus untuk menyimpan data/variabel. Sedangkan instruksi assembly disimpan dalam section .text karena section text khusus untuk menyimpan code.

Untuk melihat keterkaitan antara assembly dan bahasa mesin kita bisa melihat opcode dari program assembly yagn kita buat dengan program objdump pada gambar berikut ini.

Opcode di sebelah kiri adalah versi bahasa mesin dari bahasa assembly di sebelah kanannya. Hal ini menunjukkan eratnya kaitan antara assembly dan bahasa mesin. Contohnya adalah instruksi assembly INT 0×80 diterjemahkan ke bahasa mesin: 0xCD 0×80 (dalam hexa) atau 11001101 (binary dari 0xCD) 10000000 (binary dari 0×80).

Perhatikan bahwa pada source code assembly, “MOV EDX, len” setelah dicompile diterjemahkan menjadi “MOV EDX, 0xE”. Hal ini karena len adalah konstanta berisi panjang string “Hello, World!” yaitu sepanjang 14 karakter. Instruksi assembly pada source code “MOV ECX, msg” setelah dicompile diterjemahkan menjadi “MOV ECX, 0×80490a4″. Mengapa msg diterjemahkan menjadi 0×80490a4? Hal ini karena msg adalah address dari string “Hello, World!” sehingga setelah dicompile diterjemahkan menjadi alamat 0×80490a4. Terlihat juga pada gambar di atas pada lokasi 0×80490a4 terdapat string “Hello, World!”.

Dalam program hello world di atas kita memanfaatkan system call untuk menampilkan teks di layar monitor. System call adalah gerbang menuju kernel mode bagi program yang membutuhkan servis yang hanya bisa dikerjakan oleh kernel.

System call di dipanggil dengan menggunakan interrupt 80 hexa. Nomor system call dimasukkan dalam register EAX. Daftar lengkap nomor systemcall bisa dibaca di file header: /usr/include/asm/unistd.h. Berikut adalah cuplikan isi dari file unistd.h.

#ifndef _ASM_I386_UNISTD_H_
#define _ASM_I386_UNISTD_H_
 
/*
 * This file contains the system call numbers.
 */
#define __NR_restart_syscall        0
#define __NR_exit                           1
#define __NR_fork                           2
#define __NR_read                          3
#define __NR_write                         4
#define __NR_open                        5
#define __NR_close                        6
#define __NR_waitpid                     7
#define __NR_creat                         8
 

Tambahan

Beberapa hal penting yang perlu diingat :

. Bagian deklarasi variabel tidak boleh dijalankan, harus dilewati dengan melakukan lompatan ke label setelahnya.

. Semua perintah assembly yang membutuhkan 2 operand seperti MOV memiliki syarat sebagai berikut :

- Kedua operand besarnya harus sama.

Contoh : MOV ax,bl ; ini salah karena AX 16 bit dan bl 8 bit

MOV al,bl ; ini benar, AL dan BL besarnya 8 bit

- Kedua operand tidak boleh keduanya variable

Contoh :

MOV a,b ; ini salah, kedua operand a dan b adalah variable

MOV al,b ; kedua perintah ini untuk menggantikan perintah

MOV a,al ; yang salah diatas

- Register segment tidak boleh diisi langsung, harus menggunakan perantara
Contoh :

MOV es,0b800h : salah, es tidak boleh diisi langsung

MOV ax,0b800h ; kedua perintah ini untuk menggantikan perintah

MOV es,ax ; yang salah diatas

. Untuk intterupt, ingatlah bahwa setiap interrupt memiliki syarat – syarat sebelum dipanggil. Penuhi syarat – syarat itu sebelum melakukan intterupt.

Bagi seseorang yang bergelut di dunia security bahasa Assembly adalah bahasa yang wajib dikuasai. Karena bahasa ini adalah bahasa tingkat rendah, dekat dengan bahasa mesin (biner), maka mempelajari bahasa ini akan sangat menguntungkan. Dengan mempelajari bahasa assembly, sedikit banyak secara otomatis kita akan memahami cara komputer bekerja lebih dalam lagi.

Sebagai pembuka sebelum saya membahas mengenai shellcode, buffer overflow dan teknik exploitasi lain yang membutuhkan pemahaman mengenai assembly dan sistem operasi. Bila anda ingin menjadi hacker yang baik, anda wajib menguasai bahasa ini.

Pada dasarnya komputer adalah makhluk digital yang hanya mengerti digit 1 dan digit 0 (binary). Komputer hanya mau menerima data dalam bentuk binary dan juga hanya bisa mengerti perintah dalam bentuk binary. Perintah dalam bentuk binary ini disebut dengan bahasa mesin.

Secara umum program bisa dilihat sebagai urutan langkah/perintah/instruksi untuk menyelesaikan sesuatu. Programmer bisa langsung membuat program dengan menuliskan perintah dalam bentuk 1 dan 0 (bahasa mesin), atau menggunakan bahasa tingkat tinggi yang lebih manusiawi seperti C, Visual Basic atau Java.

Hanya dua simbol yang dimengerti komputer, yaitu 1 dan 0

Perhatikan contoh sederhana ini: programmer ingin menyimpan nilai register EAX ke dalam stack. Dalam bahasa mesin programmer harus menuliskan 01010000. Sedangkan dalam bahasa assembly programmer cukup menulis PUSH EAX. Manakah yang lebih manusiawi? Tentu menggunakan assembly lebih manusiawi. Sangat sulit bagi manusia bila harus selalu menggunakan 1 dan 0 setiap memberi perintah.

Semakin tinggi bahasanya, maka semakin manusiawi cara memberi perintahnya. Contohnya bila programmer ingin menampilkan suatu teks di layar monitor, dalam bahasa C programmer cukup menuliskan printf(”Hello World”), mudah dan singkat. Namun dalam bahasa yang lebih rendah seperti assembly, dibutuhkan sekitar 5 langkah untuk menyelesaikan tugas yang sama.

Semua program dalam bahasa apapun dibuatnya, pada akhirnya ketika akan dieksekusi akan diterjemahkan dalam bahasa mesin, karena itulah satu-satunya bahasa yang dimengerti prosesor.

Karena bahasa assembly adalah mnemonic (singkatan) untuk instruksi dalam bahasa mesin. Maka perintah-perintah dalam bahasa assembly terkait erat dengan prosesornya. Setiap prosesor memiliki instruction set masing-masing,sehingga bahasa assembly untuk prosesor Intel akan berbeda dengan assembly untuk prosesor lainnya. Namun karena intel menguasai pangsa pasar prosesor maka hampir semua produsen prosesor membuat instruksi set yang kompatibel dengan intel.

Bahasa assembly adalah mnemonic dari instruksi bahasa mesin (berbentuk binary) yang disebut opcode

Assembly AT&T dan NASM

Ada dua sintaks bahasa assembly, yaitu dalam format AT&T dan NASM. Sintaks AT&T banyak dipakai dalam lingkungan GNU seperti GNU Assembler, dan menjadi format default GNU Debugger (GDB). Sedangkan format NASM dipakai oleh netwide assembler dan banyak dipakai di lingkungan windows.

Perlu dicatat bahwa perbedaan NASM dan AT&T ini hanya masalah sintaks saja, keduanya menghasilkan bahasa mesin yang sama persis

Beberapa perbedaan antara format AT&T dan NASM adalah:

  • 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 ,). Sedangkan NASM menuliskan tujuan sebagai operand pertama (contoh: CMD ,).

Cara mengkompile program assembler

  • Untuk mengkompile program assembler diperlukan kompiler program asembler, salah satunya Turbo Asembler dengan menjalankan program TASM.EXE dan TLINK.EXE
  • Source kode program disimpan dengan ekstensi .ASM
  • Program dapat ditulis dengan notepad (windows) atau edit(dos)
  • TASM.EXE digunakan mengkompile source code menjadi file object berekstensi .OBJ
  • TLINK.EXE digunakan mengkompile file object menjadi file executable .EXE


Silahkan memberi komentar apabila ada saran atau kritikan.....thanks sebelumnya ya :D

1 komentar:

Anonim mengatakan...

Artikel menarik, jadi pengen coba belajar assembly

Posting Komentar

Tinggalkan komentar untuk perbaikan atau kritik dan saran serta pertanyaan...thanks....:)