TUGAS_praktek

download TUGAS_praktek

of 67

description

m

Transcript of TUGAS_praktek

BAHASA RAKITANVARIABEL

Nama : Angga FerdianNPM: 15111103 Kelas: Sistem Informasi ( C )

SISTEM INFORMASIUNIVERSITAS BATAM

VARIABEL

Variabel adalah nama simbolik untuk lokasi dalam memori dimana data disimpan. Dalam bahasa assembly, variabel diidentifikasikan oleh label. Setiap label menunjukan lokasi awal variabel. Kita katakan bahwa offset label adalah jarak dari awal segmen ke awal variabel. Label, tidak menunjukan berapa banyak byte memori yang dialokasikan untuk bariabel. Contoh, jika kita mendeklarasikan array 4 karakter, lebel aList hanya mengidentifikasikan offset karakter awal (A) Jadi jika huruf awal pada offset 0, maka selanjutnya pada offset 1, 2 dan seterusnya. Kita menggunakan memori berdasarkan pada tipe yang didefinisikan sebelumnya :

Deskripsi Byte Atribut

DB DW DD DF, DP DQ DT Define byteDefine wordDefine doublewordDefine far pointerDefine quadwordDefine tenbytes1246810ByteWordDoubleword Far pointerQuadwordTenbyte

Define byte (DB)Perintah DB mengalokasikan memori untuk satu atau lebih nilai 8-bit. Diagram sintak berrikut menunjukan bahwa nama adalah pilihan, dan hanya satu initial value yang diperlukan. Jika diperlukan lebih dari satu maka dipisahkan dengan koma :

[name] DB initialvalue [, initialvalue]

Initial value dapat berupa satu atau lebih nilai angka 8-bit, konstanta string, ekspresi konstan atau tanda tanya (?). jika nilai bertanda maka rangenya 128 - + 127, jika tidak bertanda rengenya 0-255. berikut contohnya :

A B C D1 2 3 4DeklarasiAList db ABCDIsiOffsetDisimpan sebagaichar db Asigned1 db -128signed2 db +127unsigned1 db 0unsigned2 db 255

Nilai banyak (multiple values), daftar bilangan-bilangan 8-bit mungkin dikelompokan dibawah satu label, dengan nilai dipisahkan oleh koma. Pada contoh berikut, kita umpamakan bahwa daftar disimpan pada offset 0000. Ini artinya bahwa 10 disimpan pada offset 0000, 20 pada offset 0001, 30 pada offset 0002, dan 40 pada offset 0003. List db 10, 20, 30, 40

Karakter dan integer adalah satu dan sama. Variabel berikut mengandung nilai yang sama dan mungkin diproses dengan cara yang sama : char db Ahex db 41hdec db 65bin db 01000001boct db 101q

Setiap konstanta mungkin menggunakan radix yang berbeda ketika daftar item didefinisikan, dan angka, karakter dan konstanta string mungkin dicampur secara bebas. Jika nomor heksadesimal mulai dengan huruf (A-F), maka nol diawal ditambahkan untuk membedakannya dengan label. Dalam conoh ini, list1 dan list2 mempunyai isi yang sama :

list1 db 10, 32, 41h, 00100010blist2 db 0Ah, 20h, A, 22h

Isi variabel mungkin tidak didefinisikan, untuk hal seperti ini menggunakan operator tanda tanya (?). atau ekspresi bilangan dapat memberi nilai awal sebuah variable dengan nilai yang dihitung pada saat diassembly. Contoh :

count db ?ages db ?,?,?,?,?rowsize db 10*20

Varibel dapat diberi nilai string dimana variabel merupakan alwam byte awal. Contoh berikut menunjukan satu string diakhiri oleh byte nol (mengandung 0), dan string lain dengan panjangnya ditulis pada awal byte :

c_string db Good afternoon, 0pascal_string db 14, Good afternoon

Perintah DB adalah perintah yang digunakan untuk menyimpan satu atau lebih baris teks. Variabel tunggal mungkin dilanjutkan untuk banyak baris tanpa perlu membuat label untuk masing-masing baris. String berikut diakhiri oleh akhir baris dan byte null :

a_long_string db This is a long string, thatdb clearly is going to takedb several lines to store in andb assembly language program, 0Dh, 0Ah, 0

Assembler dapat menghitung panjang string secara otomatis. Dengan menggunakan karakter $ yang menyimpan lokasi sekarang nilai counter. Pada contoh berikut

a_string_len diset awal 16 :a_string db This is a stringa_string_len db $- a_string

Define Word (DW)Perintah DW membuat tempat penyimpan untuk satu atau lebih word 16-bit. Sintaknya adalah sebagai berikut [name] DW initialvalue [, initialvalue]

Initialvalue mungin berupa nilai bilangan 16-bit dari 0 65,535 (FFFFh). Jika initialvalue bertanda, range yang dapat diterima adalah dari 32,768 (8000h) sampai +32,767 (7FFFh). Konstanta karakter mungkin disimpan pada bagian bawah word. Kontanta string yang besar yang mungkin disimpan dalam word panjangnya 2 karakter, seperti AB. Mungkin juga membiarkan variabel tidak terinisiaslisasi dengan menggunakan operator (?).

Pembalikan Format Penyimapan (Reversed Storage Format). Assembler membalik byte dalam nilai word ketiak disimpan dalam memori. Byte paling bawah berada pada alamat paling bawah. Ketika variabel dipindahkan ke register 16-bit, CPU akan membalik kembali byte tersebut. Ini ditunjukan pada ilustrasi berikut, dimana 2AB6h disimpan dalam memori sebagai B6 2A.

Deklarasi data : value1 dw 2AB6hPenyimpanan : B6 2A

Berikut ini tambahan contoh untuk DW. Seperti pada DB, tanda Tanya memerintahkan assembeler untuk tidak menginisialisasi loakasi memori dengan nilai tertentu :

dw 1, 2, 3 ; mendefinisikan 3 worddw 0,65535 ; bilangan tidak bertanda tertendah dan tertinggidw 32768, +32767 ; bilangan bertanda terendah dan tertinggidw 256*2 ; ekspresi kontantadw 4000h ; notasi heksadesimaldw 1111000011110000b ; notasi binerdw 1000h, 4096, AB, 0 ; notasi campurandw ? ; word tunggal tidak diinsialisasi

Pointer. Offset variabel atau subrutin mungkin disimpan dalam variabel lain yang disebut pointer. Pada contoh berikut, assembler menset P ke offest list. Kemudian PI mengandung alamat P. Akhirnya, aProc mengandung offset label yang disebut Clear_screen :

list dw 256, 257, 258, 259P dw listP2 dw PaProc dw clear_screen

Define Doubleword (DD)Perintah DD membuat tempat penyimpan untuk satu atau lebih doublewords 32-bit. Sintaknya sebagai berikut :

[name] DD initialvalue [, initialvalue]

Initialvalue dapat berupa nomor biner sampai 0FFFFFFFFh, alamat segmet-offset, 4-byte bilangan real, atau bilangan real desimal. Byte-byter dalam variabel doubleword disimpan dengan urutan terbalik, sehingga digit yang paling berarti disimpan pada alamat paling bawah. Contoh, nilai 12345678h akan disimpan dalam memori sebagai:Offset : 00 01 02 03Nilai : 78 56 34 12

Anda dapat mendefinisikan satu atau leibh doubleword. Dalam contoh berikut, far_pointer1 tidak diinsialisasi. Assembler langsung menginisialisasi far_pointer2 dengan 32-bit alamat segment offset subroutine1 :

signed_val dd -2147483648far_pointer1 dd ?far_pointer2 dd subroutine1

Operator DUPOperator DUP hanya tampil sessudah perintah pengalokasian memori (DB, DW, DD, DQ, DT). Dengan DUP, anda dapat mengulang satu atau lebih nilai ketika mengalokasian memori. Ini khususnya berguna ketika pengalokasian ruang untuk tabel atau array. Contoh-contoh berikut menginisialisasi tempat penyimpan dengan nilai default :

db 20 dup (0) ; 20 byte semuanya sama dengan noldb 20 dup (?) ; 20 byte tidak diinisialisasidb 4 dup (ABC) ; 12 byte : ABCABCABCABCdb 4096 dup (0) ; 4096-byte , semuanya noldw 5 dup (1000h) ; 5 word, masing-masing sama dengan noldw 5 dup (?) ; 5 word, tidak diinisialisasidd 100h dup(?) ; 256 doublewordk (1024 byte)

Operator DUP mungkin juga bersarang. Contoh pertama yang membuat tempat penyimpan yang mengandung 000XX000XX000XX000XX. Contoh kedua membuat tabel word dua dimensi dengan 3 baris dan 4 kolom.

aTable db 4 dup ( 3 dup(0), 2 dup(X))aMatrix dw 3 dup (4 dup(0))

Pemeriksaan tipe. Ketika variabel dibuat dengan menggunakan DB, DW, DD atau perintah definisi data yang lain, assembler memberinya atribut asal (byte, word, doubleword) berdasarkan ukurnya. Tipe ini dicek ketika anda merujuk pada variable tersebut, dan akan terjadi kesalahan jika tipenya tidak sesuai. Contohnya, anda ingin memindahkan byte paling rendah varibel 16-bit ke dalam register 8-bit. Instruksi MOV berikut akan salah karena count bertipe word dan AL adalah byte :

mov al, count ; error : ukuran operand harus cocok.count dw 20h

Pemeriksaan tipe seperti itu bagus karena membantu untuk menghindari kesalahan logika. Jika diperlukan anda dapat menggunakan perintah LABEL untuk membuat nama baru (dan tipe data) pada alamat yang sama. Sekarang variabel dapat diakses menggunakan nama juga :

mov al, count_lowmov cx, countcount_low label bytecount dw 20h

INSTRUKSI TRANSFER DATA

Instruksi MOVKarena MOV menyalin data dari satu operand ke operand lain, maka ini disebut instruksi transfer data. Pada prosesor 8086 dan 80286, operandnya 8 atau 16 bit. Pada 80386 dan 80486, operand 32-bit juga mungkin digunakan. Sintaknya sebagai berikut :

MOV tujuan, sumber

Data benar-benar disalin sehingga operand sumber tidak berubah. Sumber mungkin berupa nilai, register, atau operand memori. Tujuan mungkin berupa nilai, register atau operand memori. Tujuan mungkin berupa register atau operand memori. Operand Register. Pemindahan hanya melibatkan register, ini paling efisien. Satu register berperan sebagai operand sumber, dan yang lainya, selain CS dan IP berperan sebagai operand tujuan.Operand immediate. Nilai langsung (konstanta integer) mungkin dipindahkan ke suatu register (kecuali register segemen atau IP) dan mungkin dipindahkan ke memori. Kesalahan umum disebabkan nilai lebih besar daripada operand tujuan.Operand langsung. Variabel mungkin salah satu (tapi tidak keduanya) operand dalam instruksi MOV. Isi variabel mungkin sumber atau tujuan move. Contoh MOV dengan semua tiga tipe seperti berikut :

mov al, blmov dx, cxmov bl, 1mov bx, 8FE2hmov al, countmov total, axmov total, 1000hcount db 10total dw 0

Operand mempunyai sedikit keterbatasan, yang berdasarkan rancangan fisik pemroses dan set instruksinya. Berikut ini tidak diperbolehkan :

- CS atau IP sebagai register tujuan- Memindahkan data immediate ke register segmen- Memindahkan dari register segmen ke register segmen- Perbedaan ukuran antara operand sumber dan tujuan- Nilai immediate sebagai tujuan- Perpinadahan dari memori ke memoriContoh pemindahan yang tidak diperbolehkan :

mov ip, ax ; ip sebagai tujuanmov ds, 1000h ; immediate ke segmenmov ds, es ; segmen ke segmenmov al, bx ; ukuran operan tidak samamov si, al ; ukuran operan tidak samamov word_1, al ; ukuran operan tidak samamov 1000h, ax ; immediate sebagai tujuanmov word_2, word_1 ; memori ke memoriword_1 dw 1000hword_2 dw 0

OffsetAnda dapat menambahkan offset pada operand memori. Dengan ini maka anda dapat mengakses nilai data yang tidak mempunyai label. Misalkan kita punya daftar nomor 8-bit yang disebut array. Kemudian array+1 adalah nama yang mengacu pada offset 1 byte lebih dari array. Keduanya, array dan array+1 mempunyai offset yang dihitung oleh assembler sebagai offset fixed dari permulaan segemen data. Alamat-alamat tersebut digunakan untuk mengakses memori pada offset yang diberikan, seperti contoh berikut :

. dataarray db 10, 20, 30, 40, 50. codemov al, array ; isi = 10mov dl, array+1 ; isi = 20mov dh, array+4 ; isi = 50

Ukuran atribut kedua operand harus sesuai. Dalam contoh berikut, int_1 hanya dapat dipasangkan dengan register 16-bit. Juga, byte_1 hanya dapat dipasangkan dengan register 8-bit :

. dataint_1 dw 1000hbyte_1 db 10h. codemov ax, int_1mov int_1, simov al, byte_1mov byte_1, dl

Operator PTR. Biasanya kita menggunakan operator PTR untuk mengetahui tipe operand. Nama PTR tidak benar kalau dimaksudkan penggunaan pointer ini bernar-benar mengidentifikasikan atribut operand memori. Pada contoh berikut, WORD PTR mengidentifikasikan count sebagai variabel berukuran word, dimana BYTE PTR mengidentifikasikan var2 sebagai operand 8-bit.mov word ptr count, 10 mov byte ptr var2, 5

Perintah XCHGPerintah XCHG menukarkan isi dari dua register atau antara register dengan variabel. Sintaknya sebagai berikut :

XCHG op1, op2

Dua operand mungkin register atau operand memori, selama satu operandnya register. XCHG adalah cara yang efisien untuk menukarkan dua operand 8-bit atau 16-bit karena tidak memerlukan register ketiga untuk menyimpan nilai sementara. Khususnya dalam aplikasi pengurutan, instruksi ini mempunyai keuntungan karena kecepatannya. Satu atau kedua operand mungkin register, atau register mungkin dikombinasikan denan operand memori. Dua operand memori tidak boleh digunakan secara bersamaan. Contoh berikut adalah contoh yang benar :xchg ax, bxxchg ah, alxchg var1, bx

BAHASA RAKITANINTERRUPT

Nama : Angga FerdianNPM: 15111103 Kelas: Sistem Informasi ( C )

SISTEM INFORMASIUNIVERSITAS BATAM

INTERRUPT

PENGERTIAN INTERRUPTInterupsi adalah suatu permintaan khusus kepada mikroposesor untuk melakukan sesuatu. Bila terjadi interupsi, maka komputer akan menghentikan dahulu apa yang sedang dikerjakannya dan melakukan apa yang diminta oleh yang menginterupsi.Pada IBM PC dan kompatibelnya disediakan 256 buah interupsi yang diberi nomor 0 sampai 255. Nomor interupsi 0 sampai 1Fh disediakan oleh ROM BIOS, yaitu suatu IC didalam komputer yang mengatur operasi dasar komputer. Jadi bila terjadi interupsi dengan nomor 0-1Fh, maka secara default komputer akan beralih menuju ROM BIOS dan melaksanakan program yang terdapat disana. Program yang melayani suatu interupsi dinamakan Interrupt Handler.

VEKTOR INTERUPSISetiap interrupt akan mengeksekusi interrupt handlernya masing-masing berdasarkan nomornya. Sedangkan alamat dari masing- masing interupt handlertercatat di memori dalam bentuk array yang besar elemennya masing-masing 4 byte. Keempat byte ini dibagi lagi yaitu 2 byte pertama berisi kode offset sedangkan 2 byte berikutnya berisi kode segmen dari alamat interupt handler yang bersangkutan. Jadi besarnya array itu adalah 256 elemen dengan ukuran elemen masing-masing 4 byte. Total keseluruhan memori yang dipakai adalah sebesar 1024 byte (256 x 4 = 1024) atau 1 KB dan disimpan dalam lokasi memori absolut 0000h sampai 3FFh. Array sebesar 1 KB ini disebut Interupt Vector Table (Table Vektor Interupsi). Nilai-nilai yang terkandung pada Interupt Vector Table ini tidak akan sama di satu komputer dengan yang lainnya.Interupt yang berjumlah 256 buah ini dibagi lagi ke dalam 2 macam yaitu:- Interupt 00h - 1Fh (0 - 31) adalah interrupt BIOS dan standar di semua komputer baik yang menggunakan sistem operasi DOS atau bukan. Lokasi Interupt Vector Table-nya ada di alamat absolut 0000h-007Fh.- Interupt 20h - FFh (32 - 255) adalah interrupt DOS. Interrupt ini hanya ada pada komputer yang menggunakan sistem operasi DOS dan Interupt Handler-nya diload ke memori oleh DOS pada saat DOS digunakan. Lokasi Interupt Vector Tablenya ada di alamat absolut 07Fh-3FFh.

NomorInterruptNamaInterruptNomorInterruptNamaInterrupt

*00hDivide By Zero10hVideo Service

*01hSingle Step11hEquipment Check

*02hNon MaskableInt(NMI)12hMemory Size

*03hBreak point13hDisk Service

04hArithmatic Overflow14hCommunication (RS-232)

05hPrint Screen15hCassette Service

06hReserved16hKeyboard Service

07hReserved17hPrinter Service

08hClock Tick(Timer)18hROM Basic

09hKeyboard19hBootstrap Loader

0AhI/O Channel Action1AhBIOS time & date

0BhCOM 1 (serial 1)1BhControl Break

0ChCOM 2 (serial 2)1ChTimer Tick

0DhFixed Disk1DhVideo Initialization

0EhDiskette1EhDisk Parameters

0FhLPT 1 (Parallel 1)1FhGraphics Char

Gambar 3.1. BIOS Interrupt

Interrupt ini telah dipastikan kegunaannya oleh sistem untuk keperluan yang khusus , tidak boleh dirubah oleh pemrogram seperti yang lainnya. DEVIDE BY ZERO : Jika terjadi pembagian dengan nol maka proses akan segera dihentikan. SINGLE STEP : Untuk melaksanakan / mengeksekusi intruksi satu persatu. NMI : Pelayanan terhadap NMI (Non Maskable Interrupt) yaitu interupsi yang tak dapat dicegah. BREAK POINT : Jika suatu program menyebabkan overflow flag menjadi 1 maka interrupt ini akan melayani pencegahannya dan memberi tanda error.

NomorInterruptNama Interrupt

20hTerminate Program

21hDOS Function Services

22hTerminate Code

23hCtrl-Break Code

24hCritical Error Handler

25hAbsolute Disk Read

26hAbsolute Disk Write

27hTerminate But Stay Resident

Gambar 3.2. DOS Interrupt

Didalam pemrograman dengan bahasa assembler kita akan banyak sekali menggunakan interupsi untuk menyelesaikan suatu tugas. Interrupt dapat dipandang sebagai sejumlah fungsi. Fungsi-fungsi ini memudahkan pemrograman, bahkan menulis kode untuk mencetak karakter, kita dapat dengan mudah memanggil interrupt dan fungsi tersebut akan melakukannya untuk kita. Ada juga fungsi interrupt yang berkerja dengan disk drive dan hardware lainnya. Pada saat kita memanggil suatu fungsi hal itu dinamakan software interrupts. Interrupt juga dipicu oleh hardware lainnya, ini disebut hardware interrupts. Saat ini kita akan membahas pada software interrupts. Untuk membuat software interrupt ada suatu instruksi yaitu INT, dengan sintak: INT value Dimana value berupa angka antara 0 - 255 (atau 0 - 0FFh), umumnya kita menggunakan angka hexadecimal. Anda mungkin berpikir bahwa hanya ada 256 function, tapi sebenarnya kurang tepat . Tiap interrupt masih punya subfunction. Untuk Menentuka suatu sub-function Register AH harus diset sebelum pemanggilan interrupt.Tiap interrupt mempunyai hingga 256 sub-function (jadi kita dapatkan 256 * 256 = 65536 function). Secara umum register AH yang digunakan, tetapi suatu saat register lain juga dipakai. Pada umumnya register lain digunakan untuk mengirim parameter dan data ke sub-function. Contoh berikut ini menggunakan INT 10h sub-function 0Eh untuk mencetak pesan "Hello!". Fungsi ini menampilkan karakter di layar, keuntunganThis functions displays a character on the screen.

ORG 100h ; directive utk membuat file .com.; sub-function yang dipakai; tidak memodifikasi register AH pd saat; return, jadi hanya di set sekali saja.MOV AH, 0Eh ; pilih sub-function.; INT 10h / 0Eh sub-function; menerima kode ASCII sbg;Karakter yg akan dicetak;di register AL .;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MOV AL, 'H' ; ASCII code: 72INT 10h ; cetak!MOV AL, 'e' ; ASCII code: 101INT 10h ; cetak!

BAHASA RAKITANMAKRO

Nama : Angga FerdianNPM: 15111103 Kelas: Sistem Informasi ( C )

SISTEM INFORMASIUNIVERSITAS BATAM

MAKRO

1. Makro kurang lebih mirip dengan Prosedur, hanya saja Makro lebih canggih, karena bisa menggunakan Parameter.2. Makro tidak menggunakan perintah CALL seperti pada Procedure3. Format penulisan Makro : nama_macro MACRO [P1/P2]

ENDM4. Penggunaan Parameter ([P1/P2]) boleh ada, boleh tidak, boleh lebih dari 1 dengan dipisahkan tanda koma.5. Jika Makro menggunakan Label, yang dipanggil lebih dari 1, maka HARUS menggunakan kata kunci LOCAL

Contoh Program dengan MAKRO :; DEKLARASI MAKRO; terdiri dari 3 makro, yaitu cetak_kar, cetak_kal, cetak_angka;cetak karaktercetak_kar macro karlocal ulang mov cx, 2 mov ah, 02 mov dl, karulang: int 21h loop ulangendm;cetak kalimatcetak_kal macro kal mov ah,09h lea dx,kal int 21hendm;cetak angkacetak_angka macro angkalocal proses, ulang, cetakproses: mov ax,angka ;ax =1234 mov bx,10 ;bx=10 xor cx,cx ;cx=0ulang: xor dx,dx div bx ;dx=ax/bx push dx ;push untuk menyimpan data ke dalam steck inc cx cmp ax,0 jne ulangcetak: pop dx ;pop untuk mengambil data dari stack add dl,'0' ;ubah angka menjadi code ascii mov ah,02h int 21h loop cetakendm; SELESAI deklarasi MAKRO

;mulai penggunaan makro.model small.codeorg 100hproses: jmp xk db ' STMIK EL RAHMA YOGYAKARTA $'a dw 2009x:cetak_kar 'w'cetak_kal kcetak_angka aint 20hend proses

PUSTAKA MAKRO1. Bila banyak menggunakan makro, maka dapat dijadikan 1 menjadi suatu Pustaka Makro2. Pustaka Makro adalah suatu File dengan Extensi .MCR yang berisi beberapa atau banyak Makro3. File .MCR tadi harus 1 folder dengan file .ASM yang memanggilnya.4. Untuk memanggilnya menggunakan kata kunci INCLUDE nama_file_pustaka.MCR

Contoh program dengan Pustaka Makro.a. Buat file pustaka makronya dengan nama "pustaka.mcr", isinya :;cetak karaktercetak_kar macro karlocal ulang mov cx, 2 mov ah, 02 mov dl, karulang: int 21h loop ulangendm;cetak kalimatcetak_kal macro kal mov ah,09h lea dx,kal int 21hendm;cetak angkacetak_angka macro angkalocal proses, ulang, cetakproses: mov ax,angka ;ax =1234 mov bx,10 ;bx=10 xor cx,cx ;cx=0ulang: xor dx,dx div bx ;dx=ax/bx push dx ;push untuk menyimpan data ke dalam steck inc cx cmp ax,0 jne ulangcetak: pop dx ;pop untuk mengambil data dari stack add dl,'0' ;ubah angka menjadi code ascii mov ah,02h int 21h loop cetakendmb. Buat file .ASMnya, tempat memanggil file pustaka.MCR tadi, dengan nama "pakai.asm". isinya :include pustaka.mcr ; pemanggilan file pustaka makro __BAHAYA __Sesuaikan nama file mcr-nya.model small.codeorg 100hproses: jmp xk db ' STMIK EL RAHMA YOGYAKARTA $'a dw 2009x:cetak_kar 'w'cetak_kal kcetak_angka aint 20hend prosesHasil jadinya yang pustaka makro :

Nggih, sampun, cekap semanten kemawon share bahan kuliah Pemrograman Bahasa Rakitan dari Saya : Nur Akhwan @ Teknik Informatika Angkatan 2009 STMIK El Rahma Yogyakarta

BAHASA RAKITANSTACK

Nama : Angga FerdianNPM: 15111103 Kelas: Sistem Informasi ( C )

SISTEM INFORMASIUNIVERSITAS BATAM

STACK

Secara harfiahstackberarti tumpukan, yaitu bagian memori yang digunakan untuk menyimpan nilai suatu register untuk sementara, membentuk tumpukan nilai.Stackdapat dibayangkan sebagai tabung memanjang (seperti tabung penyimpan koin). Sedangkan nilai suatu register dapat dibayangkan sebagai koin yang dapat dimasukkan dalam tabung tersebut. Jika ada data yang disimpan maka data-data tersebut akan bergeser ke arah memori rendah, dan akan bergeser kembali ke arah memori tinggi bila data yang disimpan telah diambil.

Operasi STACKStack adalah buffer memori khusus yug digunakan untuk program aplikasi dan DOS. Dua register berperan dalam stack : register SS (stack segment) mengandung lokasi basis stack; register SP (stack pointer) mengandung alamat puncak stack, dimana nilai terakhir dimasukan. Beberapa istilah yang terdapat pada stack : operasi PUSH adalah meletakan nilai baru pada stack dan mengurangi nilai stack pointer; stack bergerak kearah bawah dalam memori setiap nilai baru dimasukan. Operai POP mengeluarkan data dari stack dengan menyalin words kedalam register atau operand memori dan menambah nilai stack pointer. Setiap inputan stack panjangnya 2 byte, jadi hanya operand 16-bit yang mungkin dimasukan atau dikeluarkan. DOS membagi stack dengan program aplikasi, jadi ruang memori yang cukup harus disiapkan untuk menyediakan keduanya. Biasanya kita menggunakan 256 byte, menggunakan perintah .STACK.Instruksi PUSH. Instruksi PUSH mengurangi register SP dan menyalin isi register atau operand memori 16-bit kedalam stack pada lokasi yang ditunjuk oleh SP. Hanya pada prosesor 80286 atau yang lebih tinggi anda dapat memasukan nilai immediate. Berikut ini contoh penggunaanya :

push axpush memvalpush 1000h

Instruksi PUSH bisa digunakan untuk menyimpan nilai register sementara, untuk suatu saat diambil kembali. Instruksi POP. Instruksi POP menyalin isi stack yang ditunjukan oleh SP ke dalam register 16-bit atau variabel, dan menambah SP. Dua register, CS dan IP, tidak boleh digunakan sebagai operand. Contoh POP seperti terlihat dibawah ini.

pop cxpop memval

Menyiman dan mengambil kembali nilai register. Berbagai cara bisa dilakukan jika sebuah register akan digunakan ulang. Pada contoh berikut, pemanggilan DOS (int21h) untuk menampilkan string pada layar. DX dan AX diasumsikan mempunya nilai penting yang harus disimpan kembali sesudah tampilan. Karena stack berstruktur LIFO (last in first out) maka register yang terakhir disimpan pertama kali :

push axpush dxmov ah, 9mov dx offset messageint 21hpop dxpop axmessage db Ini adalah pesan.$

PUSHF dan POPF. Instruksi PSUHF memasukan register flag ke dalam stack, menjaganya agar tidak terjadi perubahan. Pada lain waktu, instruksi POPF dapat digunakan untuk mengembalikan nilai flag. Contoh berikut, kita menyimpan flag sebelum memanggil subrutin yang mungkin mengubah flag.

BAHASA RAKITANOPERASI ARITMATIKA

Nama : Angga FerdianNPM: 15111103 Kelas: Sistem Informasi ( C )

SISTEM INFORMASIUNIVERSITAS BATAM

OPERASI ARITMATIKA

PenjumlahanSyntax :ADD destination, sourceADC destination, sourceINC destinationPerintah ADD akan menjumlahkan nilai padadestinationdansourcetanpa menggunakancarry (ADD), dimana hasil yang didapat akan ditaruh padadestination. Dalam bahasa pascal pernyataan ini sama dengan pernyataandestination := destination + source. Daya tampungdestinationdansourceharus sama misalnya register al (8 bit) dan ah (8 bit), ax (16 bit) dan bx (16 bit). Perhatikan contoh berikut, nilairegister ahsekarang menjadi$10:mov ah, $5;mov al, $8;add ah, al

Perintah ADC digunakan untuk menangani penjumlahan dengan hasil yang melebihi daya tampungdestinationyaitu dengan menggunakancarry (ADD), dalam bahasa pascal sama dengan pernyataandestination := destination + source + carry. Misalnyaregister ax(daya tampung 16 bit) diberi nilai$1234danbx(16 bit) diberi nilai$F221, penjumlahan kedua register ini adalah$10455. Jadi ada bit ke 17 padahal daya tampung register bx hanya 16 bit, penyelesaiannya adalah nilaibx = $0455dengancarry flag = 1.Perintah INC digunakan untuk operasi penjumlahan dengan nilai 1. Jadi nilai pada destination akan ditambah 1, seperti perintahdestination := destination + 1dalam bahasa Pascal.

PenguranganSyntax :SUB destination, sourceSBB destination, sourceDEC destinationPerintah SUB untuk mengurangkan 2 operand tanpa carry flag. Hasilnya diletakkan pada destination dalam bahasa pasca sama dengan pernyataandestination := destination source. Untuk mengenolkan suatu register, kurangkan dengan dirinya sendiri seperti contoh berikut ini. Pertama kaliregister axbernilai$5, kemudian nilai register tersebut dikurangi dengan dirinya sendiri sehingga terakhir nilairegister axadalah0.mov ax, $15;mov bx, $10;sub ax, bx;sub ax, ax;Perintah SBB mengurangkan nilai destination dengan nilai source kemudian dikurangi lagi dengan carry flag (destination := destination source carry flag). Dan perintah DEC untuk mengurangi nilai destination dengan 1.

PerkalianSyntax :MUL sourceDigunakan untuk mengalikan data pada accumulator dengan suatu operand dan hasilnya diletak pada register source.Register sourcedapat berupa suatu register 8 bit (misal bl, bh, dan sebagainya), register 16 bit (bx, dx, dan sebagainya) atau suatu variabel.

PembagianSyntax :DIV sourceOperasi aritmatika ini pada dasarnya sama dengan operasi perkalian

Instruksi AritmetikHampir semua program komputer dapat melaksanaklan operasi aritmetik. Set intruksi Intel mempunyai instruksi untuk aritmetik integer, menggunakan operand 8-bit dan 16-bit. Operasi floating-point ditangani dalam salah satu dari ketiga cara berikut : 1. Chip koprosesor matematika khusus (8087, 80287, 80387). 2. Rutin perangkat lunak yang berfungsi sama dengan koprosesor, atau 3. Perangkat lunak yang mengkonversi nilai floating-point ke integer, menghitung, dan kemudian mengkonversi bilangan kembali ke floating-point.

Instruksi INC dan DECInstruksi INC dan DEC menambah 1 atau mengurang 1 nilai dari suatu operand, secara berurutan. Sintaknya sebagai berikut :INC tujuanDEC tujuan

Tujuan mungkin register 8-bit atau 16-bit atau operand memori. INC dan DEC lebih cepat dari instruksi ADD dan SUB. Semua status flag dipengaruhi kecuali flag Carry. Contohnya sebagai berikut :

inc aldec bxinc membytedec byte ptr membytedec memwordinc word ptr memword

Instruksi ADDInstruksi ADD menjumlahkan operand sumber 8 atau 16-bit ke operand tujuan pada ukuran yang sama. Sintaknya sebagai berikut :

ADD tujuan, Sumber tidak diubah oleh operasi. Ukuran operand harus sesuai dan hanya satu operand memori yang digunakan. Register segment tidak boleh jadi tujuan. Semua status flag dipengaruhi. Contoh sebagai berikut :

add al, 1add cl, aladd bx, 1000hadd var1, axadd dx, var1add var1, 10

Instruksi SUBInstruksi SUB mengurangkan operad sumber dari operand tujuan. Sintak SUB sebagai berikut :SUB tujuan, sumber Ukuran kedua operand harus sesuai, dan hanya boleh satu operand memori. Register segment tidak boleh jadi operand tujuan. Pada level bit, yang terjadi adalah operand source dinegasikan kemudian ditambahkan ke tujuan. Contoh, 4-1 adalah 4+(-1). Mengingat kembali bahwa notasi twos komplemen digunakan untuk menegasikan bilangan, jadi 1 disimban sebagai 11111111b : 0 0 0 0 0 1 0 0 (4)+ 1 1 1 1 1 1 1 1 (-1) 0 0 0 0 0 0 1 1 (3)

Penjumlahan ini menghasilkan carry pada bit yang paling tinggi (menset carry flag), tetapi carry sendiri diabaikan ketika bekerja dengan bilangan bertanda. Contoh SUB digunakan dengan berbagai tipe operand seperti berikut :

sub al, 1sub cl, alsub bx, 1000hsub var1, axsub dx, var1sub var1, 10

Flag yang dipengaruhi oleh ADD dan SUBJika ADD atau SUB menghasilkan nilai nol, maka flag zero di set; jika hasil negatif maka flag tanda di set. Pada contoh beirkut, baris 2 menghasilkan nilai nol dan baris 4 menghasilkan nilai 1 (FFFFh) .

mov ax, 10sub ax, 10mov bx, 1sub bx, 2Flag zero diset ketika hasil operasi aritmetik sama dengan nol. Catatan bahwaINC dan DEC mempengaruhi flag zero tapi tidak mempengaruhi flag carry :

mov bl, 4Fhadd bl, 0B1hmov ax, 0FFFFhinc ax

Keputusan kapan operand bertanda atau tidak bertanda seluruhnya diserahkan kepada pemrogram. CPU memperbaharui flag Carry dan overflow untuk menangani dua kemungkinan. Untuk alasan ini, kita perlu membahas dua tipe operasi secara terpisah. Operasi tidak bertanda (unsigned). Untuk aritmetika tidak bertanda, kita hanya peduli pada flag carry. Jika hasil operasi penjumlahan terlalu besar untuk operand tujuan, maka flag carry diset. Contoh, penjumlahan 0FFh + 1 seharusnya sama dengan 100h, tapi hanya dua digit paling bawah (00) yang pas untuk AL. maka operasi menset flag carry :

mov ax, 00FFhadd al, 1 ; AX = 0000, CF = 1

Dalam kontek ini, ADD adalah operasi 8-bit karena AL yang digunakan. Jika kita ingin mendapatkan jawaban yang benar maka kita harus menambah 1 AX, membuatnya menjadi operasi 16-bit.

mov ax, 00FFhadd ax, 1 ; AX = 0100, CF = 0

Situasai yang sama juga terjadi ketika kita mengurangkan operand yang lebih besar (2) kepada yang lebih kecil (1). Flag carry memberitahu kita hasilnya tidak berguna.mov ax, 5501hadd ax, 2 ; AX = 55FF, CF = 1

Operasi bertanda. Flag overflow diset ketika operasi penjumlahan atau pengurangan menghasilakan bilangan bertanda diluar range.

Contoh 1 :mov al, + 126 01111110add al, 2 + 00000010 10000000 AL = -128 ?, OF =1

Contoh 2 :mov al, -128 10000000sub al, 2 - 00000010 01111110 AL = + 126?, OF = 1

Mode PengalamatanKumpulan instruksi Intel menyediakan cara yang bervariasi untuk menemukan lokasi memori cara-cara ini disebut mode pengalamatan. Dengan cara ini dapat memudahkan pemrosesan list dan untuk mengacu struktur data yang komplek. Juga, kompile bahasa tingkat tinggi memerlukannya untuk membuat instruksi mesin yang lebih sedikit ketika set instruksi CPU menggunakan cara yang baik dalam pengacuan data. Terdapat lima tipe mode pengalamatan, ditunujukan dalam tabel mode pengalamatan dibawah. Dalam tabel, dispalecement berupa angka atau offset variabel. Effective address operand mengacu pada offset (jarak) data dari awal segment. BX dan BP adalah register basis, dan SI dan DI adalah register index. Setiap contoh berikut mengacu pada isi memori pada alamat efektif. Mode pengalamatan

Mode Contoh Keterangan

MODECONTOHKETERANGAN

Direct Op1bytelist[200]Alamat efektif adalah displacement

Register Indirect[bx][si][di]EA adalah isi basis atau index

Based or Indexed list [bx][si+list][bp+4]list [di][bp-2]EA adalah penjumlahan register basis atau index dengan displacement

Base-indexed[bx + si][bx][di][bp-di]EA adalah penjumlahanregister basis dan registerindex

Base-indexed withdisplacement

[bx+si+2]list[bx+si]list [bx][si]

EA adalah penjumlahanregister basis, registerindex dan dispalcement

Operand registerOperand register mungkin berupa register 8 atau 16 bit. Secara umum, mode pengalamatan register adalah paling efisien karena register adalah bagian dari CPU dan tidak diperlukan pengaksesan memori. Beberap contoh menggunakan instruksiMOV sebagai berikut :mov ax, bxmov cl, almov si, axOperand ImmediateOperand immediate adalah ekspresi konstan, seperti angka, karakter atau ekspresi aritemetik. Assembler harus menentukan nilai operand immediate pada waktu asssembly. Nilainya disisiplak langsung kedalam instruksi mesin. Contoh operand immediate ditunjukan sebagai berikut. Contoh terkahir, (2+3)/5, adalah ekspresi yang dievaluasi apda saat assembly.Contoh Ukruan (bit)CONTOHUKURAN(BIT)

10AAB65535(2+3)/5

8816168

Operand directOperand direct mengacu pada isi memori pada offset variabel. Assembler menjaga nilai offset setiap label, membuatnya memungkinkan untuk menghitung alamat efektif operand direct. Pada contoh ini, isi memori pada lokasi count dipindah ke AL :count db 20mov al, count ; AL = 20

Oprator OFFSET. Ketika diperlukan pemindahan offset label ke dalam register atau variabel, maka digunakan operator OFFSET. Karena assembler mengetahuai offset settiap label sebagai program yang sedang diassembly, maka mudah untuk menggantikan nilai offset kedalam isntruksi. Misalkan offset variabelaWord dalam contoh berikut adalah 0200h; instruksi MOV akan memindahkan 200h ke dalam BX langsung :

aWord dw 1234mov bx, offset aWord

Operand tidak langsungJika offset variabel ditempatkan dalam register basis atau index, maka register menjadi pointer ke label. Untuk variabel yang mengandung element tunggal, maka dia akan mempunyai nilai yang kecil, tetapi untuk daftar item, pointer mungkin akan ditambah untuk menunjuk setiap elemen. Contoh, jika kita membuat string dalam memori pada lokasi 0200h dan menset BX ke offset string, kita dapat memproses elemen dalam string dengan menjumlahkan offsetnya dengan BX. F terakhir berada pada offset 5 dalam contoh berikut :CODE :aString db ABCDEFGmov bx, offset aString ; BX = 0200add bx, 5 ; BX = 0205mov dl, [bx] ; DL = F

Default segmen. Jika BX, SI atau DI digunakan, alamat efektif adalah default offset dari register DS (data segment). BP, disisi lain, merupakan offset dari register SS (Stack segment). Umpamanya segment stack dan segment data berada pada lokasi yang berbeda, dua pernyataan berikut akan menimbulkan efek yang berbeda :mov dl, [si]mov dl, [bp]

Based dan Indexed OperandOperannd basis dan indeks pada dasarnya sama : register ditambahkan pada displacement untuk mendapatkan alamat efektif. Register yang dipakai harus SI, DI, BX atau BP. Displacement adalah angka atau label yang offsetnya diketahui pada waktu assembly. Notasi mungkin dalam bentuk yang sama :

Register ditambahkan ke offset :mov dx, array[bx]mov dx, [di+array]mov dx, [array+si]Register ditambahkan ke konstanta :mov ax, [bp+2]mov dl, [di-2]mov dx, 2[si]A B C D E F G

Contoh. Jika kita membuat array bernilai byte yang disimpan dal memori logaksi 0200h dan menset BX dengan 5, maka BX akan menunjuk bialngan pada offset 5 ke dalam array. Contoh berikut ini sebagai ilustrasi :Code :array db 2,16,4,22,13,19,42,64,44,88mov bx, 5mov al, array[bx]ilustrasi :array [BX] (BX = 0005) Base-Indexed OperandAlamat efektif operand dibangun oleh penggabungan register basis dengan register index. Misalkan BX = 2002h dan SI = 6; instruksi berikut akan menghitung alamat efektif 208h :

mov al, [bx +si]Teknik ini sering berguna untuk array dua dimensi, dimana BX dapat menunjuk offset baris dan SI offset kolom. Contoh berikut, alamat efektif yang dibangun oleh [bx+si] adalah 0157 :

CODE :array db 10, 20, 30, 40, 50db 60, 70, 80, 90, A0db B0, C0, D0, E0, F0.mov bx, offset array ; menunjuk pada array (0150)add bx, 5 ; memilih baris keduamov si, 2 ; memilih kolom ke tigamov al, [bx + si] ; mengambil nilai pada alamat efektif 0157

Dua buah register basis atau dua buah register index tidak dapat digabungkan, jadicontoh berikut akan salah :mov dl, [bp-bx] ; salah : dua register basismov ax, [si-di] ; salah : dua register indexBase-Indexed dengan displacementAlamat efektif operand dibangun dengan menggabungkan register basis, registerindex dan displacement. Contohnya sebagai berikut :mov dx, array [bx] [si]mov ax, [bx + si + array]add dl, [bx + si + 3]sub cx, array [bp+si]Dengan menggunakan array dua dimensi kita tidak harus lagi menset BX ke awalarray. Kita hanya menset BX pada offset baris kedua, relatif terhadap awal tabel. Iniakan menyebabkan kode lebih sederhana :CODE :array db 10, 20, 30, 40, 50db 60, 70, 80, 90, A0db B0, C0, D0, E0, F0.mov bx, 5 ; memilih baris keduamov si, 2 ; memilih kolom ke tigamov al, array[bx + si] ; mengambil nilai pada alamat efektif 0157Ilustrasi0150 0155 0157[BX] [SI]10 20 30 40 50 60 70 80 90

Penjumlahan serangkaian bilanganContoh program berikut menunjukan bagaimana bermacam-macam mode pengalamatan bisa digunakan ketika mengakses elemen sebuah array. Array berada pada offset 150, dan hasil penjumlahan akan disimpan pada offset 153. Program berikut mungkin diassemble dan dijanlankan dalam Debug.A 150db 10, 20, 30, 0A 100mov bx, 150mov si, 2mov al, [bx]add al, [bx+1]add al, [bx + si]mov [153], alint 20t..d 150, 153

BAHASA RAKITANALUR PROGRAM

Nama : Angga FerdianNPM: 15111103 Kelas: Sistem Informasi ( C )

SISTEM INFORMASIUNIVERSITAS BATAM

ALUR PROGRAMStruktur Program

Gambar 3.1. menunjukan program HELLO.ASM. Perintah untuk mengassembly dan link program ini ditunjukan oleh turbo assembler dan microsoft assembler sebagai berikut :

Turbo Assembler MASMtasm hello; masm hello;tlink hello; link hello;

Segment. Program yang jalan di DOS dibagi kedalam tiga segmen utama, masingmasingnya memiliki nilai tipe yang berbeda : segmen Code (ditunjukan oleh CS) mengandung kode program, segmen Data (ditunjukan oleh DS) mengandung variabel, segmen stack (ditunjukan oleh SS) mengandung stack program. Setiap segmen ditunjukan oleh register segmen. Sebuah segmen mungkin hanya 1 paragraf (10h byte) dan paling besar 64 K bytes. Setiap segmen mengandung instruksi atau data yang memiliki offset relatif terhadap register segmen (CS, DS, SS, atau ES). Offset adalah jarak objek dari permulaan segmennya.

Title Program Hello world [1][2]; program ini menampilkan pesan Hello, world [3][4]dosseg [5]. model small [6]. stack 100h [7][8]. data [9]. hello_message db Hello, world !, 0dh, 0ah, $ [10][11]. code [12]main proc [13]mov ax, @data [14]mov ds, ax [15][16]mov ah, 9 [17]mov dx, offset hello_message [18]int 21h [19][20]mov ax, 4000h [21]int 21h [22]main endp [23]endp main [24]Gambar 3.1. Contoh program Hello

Segmen code. Segmen code adalah dimana instruksi mesin program berada. Register CS mengandung alamat segmennya, dan IP menunjuk instruksi pertama yang akan dieksekusi. Segmen data baisanya mengandung variabel program. Catatan bahwa tidak ada register yang menunjukan segmen ini, karena itu pada setiap program EXE dimasukan baris program berikut, untuk menset DS sebagai permulaan segmen data :

mov ax, @datamov ds, ax

Segmen stack. Asegmen stack mengaikuti .MODEL, dan biasanya kita menyediakan 256 byte ruang stack. Register SS mengandung alamat segmen ini, dan SP mengacu pada alamat berikutnya setalah akhir stack. Stack akan bertambah kearah bawah pada saat suatu nilai dimasukan ke dalam stack. Jika SP mencapai 0000, maka stack berarti penuh.Perintah. Perintah TITLE mendefinisikan judul prgram sampai 128 karakter. Perintah DOSSEG memberitahu assembler untuk menempatkan segmen program dalam urutan standar yang digunakan bahasa tingkat tinggi.

Model memoriPerintah .MODEL memilih standar model memori untuk program bahasa assembly. Model memory mungkin sebagai blueprint standar atau konfigurasi, yang menentukan bagaimana segmen dihubungkan bersama. Setiap model memori memiliki sekumpulan batasan yang berbeda sebagai maksimum ruang yang tersedia untuk kode dan data. Secara umum, pemilihan model memori berarti membuat pilihan antara kecepatan eksekusi optimal dan fleksibilitas ukuran program. Model memori yang membatasi semua data ke segmen tunggal 64 K, contohnya, menjamin bahwa semua alamat data akan dekat, yaitu, 16-bit nilai. Data mungkin dapat diakses lebih cepat, karena alamat 16-bit mungkin diload dengan satu instruksi mesin. Disisi lain, model memori yang mengijinkan kode untuk diperluas sampai 64 K berakibat bahwa beberapa subrutin akan berada pada segmen yang berbeda. Ini berarti bahwa alamat 32-bit harus diload kedalam CS dan register IP ketika subrutin dipanggil. Hal ini membutuhkan dua instruksi mesin. Berbagai macam memori model didefinisikan oleh jumlah byte yang digunkan untuk kode (instruksi) dan data (variabel). Tabel berikut menunjukan rangkuman perbedaan antara berbagai tipe model :

MODELPENJELASAN

TinySmallMediumCompactLargeHugeKode dan data digabung harus