Selasa, 21 Juni 2011

INTRUKSI TRANSFER DATA

INTRUKSI TRANSFER DATA
v  INTRUKSI MOV
Oleh karena mov menyalin data dari satu operand ke operand lain maka ini disebut intruksi transfer data. Pada prosesor 8086 dan 80286, operandnya 8 atau 16-bit.
Sintaknya sebagai berikut :
            MOV tujuan, sumber
Data benar benar disalin sehingga operand sumber tidak berubah. Sumber mungkin berupa nilai, 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 segmen atau IP) dan mungkin dipindahkan ke memori.
Ø  Operand Langsung
Variable mungkin salah satu (tapi tidak keduanya) operand dalam intruksi MOV.
Contoh MOV dengan semua tipe sebagai berikut:
Mov al, bl
Mov dx, cx
Mov bl, 1
Mov bx, 8FE2h
Mov al, count
Mov total, ax
Mov total, 1000h
…
…
Count db 10
Total dw 0
Operand mempunyai sedikit keterbatasan, yang berdasarkan rancangan fisik pemroses dan set intruksinya. Berikut ii tidak diperbolehkan :
  1. CS atau IP sebagai register tujuan
  2. Memindahkan data immediate segmen ke register segmen
  3. Memindahkan dari register segmen ke register segmen
  4. Perbedaan ukuran antara operand sumber dan tujuan
  5. Nilai immediate sebagai tujuan
  6. Perpindahan dari memori ke memori
v  OFFSET
Anda 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 1byte lebih dari array. Keduanya,array dan array+,mempunyai offset yang dihitung oleh assembler sebagai offset fixed dari permulaan segmen data. Alamat-alamat tersebut digunakan untuk mengakses memori pada offset yang diberikan,seperti contoh berikut:  


.data
Array db 10,20,30,40,50,
.code
mov al,array        ;isi=10
mov dl,array+1     ;isi=20  
mov dh,array+4   ;isi=50
Nama PTR tidak benar kalau dimaksudkan penggunaan pointer ini benar benar mengidentifikasi atribut operand memori. Pada contoh berikut, WORD PTR mengidentifikasi count sebagai variable berukuran word, dimana BYTE PTR mengidentifikasikan var2 sebagai opereand 8-bit.
            Mov word ptr count, 10
            Mov byte ptr var2, 5
v  PERINTAH XCHG
Perintah XCHG menukarkan isi dari 2 register atau antara register dengan variable. Sintaknya sebagai berikut :
            XCHG                        op1, op2
Dua operand mungkin register atau operand memori, selama satu operandnya adalah register.
XCHG adalah cara yang efisien untuk menukarkan dua operand 8-bit atau 16-bit karena tidaka memerlukanb register ketiga untuk menyimpan nilai sementara. Khususna dalam aplikasi pengurutan, intruksi ini mempunyai keuntungan karena kecepatannya.
Contoh berikut adalah contoh yang benar :
            Xchg ax, bx
            Xchg ah, al
            Xchg var1, bx
v  OPERASI STACK
Stack adalah buffer memori khusus yang digunakan untuk program aplikasi dan DOS. Dua register berperan dalam stack, yaitu ss dan register sp. Register SS (stack segment) mengandung lokasi basis stack, sementara register SP (satck pointer) mengandung alamat puncak stack tempat nilai terakhir dimasukkan.
Ada beberapa istilah pada stack. Operasi PUSH adalah meletakkan nilai baru pada stack dan mengurangi nilai stack pointer, stack bergerak kea rah bawah dalam memori setiap nilai baru dimasukkan. Operasi POP mengeluarkan data dari stack dengan menyalin words kedalam register atau operand memori dan menambah nilai stack pointer. Setiap inputan stack memiliki panjang 2 byte.
Ø  Intruksi PUSH
Intruksi PUSH megurangi register SP dan menyalin isi register atau operand memori 16-bit ke dalam stack pada lokasi yang ditunjuk oleh SP. Hanya pada prosesor 80286 atau yang lebih tinggi. Anda dapat memasukkan nilai immediate. Berikut ini contoh penggunaanya :
            Push ax
            Push memval
Push 1000h
Intruksi PUSH bisa digunakan untuk menyimpan nilai register sementara untuk suatu saat diambil kembali.
Ø  Intruksi POP
Intruksi POP. Intruksi POP menyalin isi stack yang ditunjukkan oleh SP kedalam register 16-bit atau variable, dan menambah SP. Dua register, CS dan IP, tidak boleh digunakan sebagai operand. Contoh POP seperti terlihat dibawah ini.
            Pop cx
            Pop memval
Menyimpan dan mengambil kembali nilai register. Berbagai cara bisa dilakukan jika sebuah register akan digunakan ulang.pada contoh berikut, pemanggilan DOS (int 21h) untuk menampilkan string pada layar. DX dan AX diasumsikan mempunyai nilai penting yang harus disimpan kembali sesudah tampilan.. oleh karena stack berstruktur LIFO (last in first out) maka register yang terakhir disimpan pertama kali:
Push ax
Push dx
Mov ah, 9
Mov dx offset message
Int 21h
Pop dx
Pop ax
…
…
Message db”ini adalah pesan.$”
PUSHF dan POPF. Intruksi PUSHF memasukkan register flag ke dalam stack, menjaganya agar tidak terjadi perubahan. Pada lain waktu, intruksi POPF dapat digunakan untuk mengembalikan nilai flag. Contoh berikut, kita menyimpan flag sebelum memanggil subrutin yang mungkin mengubah flag.

INSTRUKSI DEFINISI DATA

INSTRUKSI DEFINISI DATA
            Variable adalah nama simbolik untuk lokasi dalam memori tempat data disimpan. Dalam bahasa assembly, variabel diidentifikasikan oleh label. Setiap label menunjukan lokasi awal variable. Kita katakan bahwa offset label adalah jarak dari awal segmen ke awal variabel.
 Label menunjukkan berapa banyak byte memori yang dialokasikan untuk variable. Contoh, jika kita mendeklarasikan array 4 karakter, label AList henya mengidentifikasikan offset karakter awal (A)
A
B
C
D
1
2
3
4
Deklarasi                                                 Isi                 AList db ‘ABCD’                  Offset
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
Define  byte
1
Byte
DW
Define  word
2
Word
DD
Define  doubleword
4
Dobleword
DF, DP
Define  far pointer
6
Far pointer
DQ
Define  quadword
8
Quadword
DT
Define  tenbytes
10
Tenbyte
Table Definisi Data
v  DEFINE BYTE (DB)
Perintah DB mengalokasikan memori untuk satu atau lebih nilai 8-bit. Diagram sintak berikut 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 range-nya -128 - + 127; jika tidak bertanda maka range-nya 0-255.


Berikut adalah contohnya :
            Char                db                    ‘A’
            Signed1           db                    -128
            Signed2           db                    +127
            Unsigned1       db                    0
            Unsigned2       db                    255
Ø  Nilai banyak (multiple values)
Daftar 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. Variable berikut mengandung nilai yang sama dan mungkin diproses dengan cara yang sama:
            Char db ‘A’
            Hex db 41h
            Dec db 65
            Bin db 01000001b
            Oct 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 heksadecimal mulai dengan huruf (A-F) maka nol diawal ditambahkan untuk membedakannya dengan label.
Dalam contoh ini, list1 dan list2 mempunyai isi yang sama:
            List1db            10, 32, 41h, 00100010b
            List2                db        0Ah, 20h, ‘A’, 22h
Isi variable mungkin tidak didefinisikan. Untuk itu, digunakan operator tanda Tanya (?). Atau, ekspresi bilangan dapat member nilai awal sebuah variable dengan nilai yang dihitung pada saat disassembly. Contoh :
            Count db ?
            Ages db ?,?,?,?,?
            Rowsize db 10*20
Variable dapat diberi nilai string dimana variable 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”, 0
            Pascal_string db 14, “good afternoon”
Perintah DB adalah perintah yang digunakan untuk menyimpan satu atau lebih baris teks. Variable tunggal mungkin dilanjutkan untuk banyak baris tanpa perlu membuat label untuk masing masing baris. String berikut diakhiri oleh baris dan byte null:
            A_long_string db”this is a long strig, that”
                        Db “clearly is going to take”
                        Db “several lines to store in an”
                        Db “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 string”
A_string_len db $-a_string
v  DEFINE WORD (DW)         
Perintah DW membuat tempat menyimpan untuk satu atau lebih word 16-bit. Sintaknya adalah sebagai berikut:
            [name] DW initialvalue [,initialvalue]
Initialvalue mungkin berupa nilai bilangan 16-bit dari 0-65,535 (FFFFh). Jika initial value bertanda, range yang dapat diterima adalah dari – 32,768 (8000h) sampai + 32,767 (7FFFh). Konstanta karakter mungkin disimpan pada bagian bawah word. Konstanta string yang besar yang mungkin disimpan dalam word panjangnya 2 karakter, seperti ‘AB’. Variable mungkin juga dibiarkan tidak terinisialisasi dengan menggunakan operator (?).
Ø  Pembalikan format penyimpanan (reversed storage format).
Assembler membalik byte dalam nilai word ketika disimpan dalam memori. Ketika variable dipindahkan ke register 16-bit, CPU akan membalik kembali byte tersebut.
Ilustrasi dimana 2AB6h disimpan dalam memori sebagai B6 2A.
            Deklarasi data : value1 dw 2AB6h
B6
2A
            Penyimpanan   :

Seperti pada DB, tanda Tanya memerintahkan assembler untuk tidak menginisialisasi lokasi memori dengan nilai tertentu. Contoh:
            dw 1, 2, 3,                                           ; mendefinisikan 3 word
dw 0,65535                                         ; bilangan tidak bertanda terendah dan tertinggi
dw -32768, +32767                            ; bilangan bertanda terendah dan tertinggi
dw 256*2                                            ; ekspresi konstanta
dw 4000h                                            ; notasi hexadecimal
dw 11111000011110000b                  ; notasi biner
dw 1000h, 4096, ‘AB’, 0                    ; notasi campuran
dw ?                                                    ; word tunggal tidak dinialisasi
offset variable atau subrutin mungkin disimpan dalam variable lain yang disebut pointer.
v  DEFINE DOUBLEWORD (DD)
Perintah DD membuat tempat penyimpanan untuk satu atau lebih doublewords 32-bit. Sintaknya sebagai berikut :
[name] DD initialvalue [ , initialvalue]…..
Initial value dapat berupa nomor biner samapai 0FFFFFFFFh, alamat segmet-offset, 4-byte bilangan real, atau bilangan riial decimal. Semua byte dalam variable doubleword disimpan dengan urutan terbalik sehingga digit yang paling berarti disimpan pada alamat peling bawah.
Contoh, nilai 12345678h akan disimpan dalam memori sebagai:
            Offset  : 00 01 02 03
            Nilai    : 78 56 34 12
v  OPERATOR DUP
Operator DUP hanya tampil sesudah perintah pengalokasian memori (DB, DW, DD, DQ, DT). Dengan DUP, anda dapat mengulang satu atau lebih nilai ketika mengalokasikan memori. Ini khusunya berguna ketika pengalokasian ruang untuk table atau aray.
Contoh:
            Dp 20 dup (0)             ; 20 byte semuanya sama dengan nol
            Db 20 dup (?)              ; 20 byte tidak diinisialisasi
            Db 4 dup (‘ABC’)      ; 12 byte:”ABCABCABCABC”
            Db 4096 dup (0)         ; 4096-byte, semuanya nol
            Dw 5 dup (1000h)      ; 5 word, masing masing sama dengan nol
            Dw 5 dup (?)               ; 5 word, tidak diinialisasi
            Dd 100h dup (?)         ; 256 doublewordk (1024 byte)
Pemeriksaan tipe. Ketika variable dibuat dengan menggunakan DB, DW, DD atau perintah definisi data yang lain, assembler memberinya atribut asal (byte, word, doubleword ) berdasarkan ukuranya. Tipe ini dicek ketika anda merujuk pada variable tersebut, dan akan terjadi kesalahan jika tipenya tidak sesuai. Contohnya, anda ingin memindahkan byte paling rendah variable 16-bit ke dalam register 8-bit. Intruksi MOV berikut akan salah karena count  bertipe word, sementara AL adalah byte:
            Mov al, count                          ; error : ukuran operand harus cocok
            …
            ….
            Count dw 20h\
Variable dapat diakses menggunakan nama juga :
            Mov al, count_low
            Mov cx, count
            …
            …
            Count_low label byte
            Count dw 20h

dasar dasar bahasa assembly


STRUKTUR PROGRAM
Perintah untuk mengassembly dan link program ini ditunjukan oleh turbo assembler dan Microsoft assembler sebagai berikut :
Turbo Assembler                     MASM
Tasm hello;                              masm hello;
Tlink hello                               Link hello;
v  SEGMENT
Program yang berjalan di DOS dibagi ke dalam tiga segmen utama.Masing – masing segmen memiliki nilai tipe yang berbeda:segmen Code (ditunjukkan oleh CS) mengandung kode program,Segmen data (Ditunjukkkan oleh DS) mengandung variable,segmen stack(ditunjukkan oleh SS) mengandung stack program.
Setiap segmen hanya ditunjukkkan oleh register segmen. Segmen mungkin hanya 1 paragraf (10 byte) dan paling besar 64 K bytes.Setiap segmen mengandung instruksi atau data yang memiliki offset relatife terhadap register segment (CS,DS,SS, atau ES). Offset adalah jarak objek dari permulaan segmentnya.
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 Contoh program hello

Ø  Segmen code.
Segmen code adalah tempat instruksi mesin program berada. Register CS mengandung alamat segmennya, dan IP menunjuk intruksi pertama yang akan dieksekusi. Segmen data biasanya mengandung variable program. Sebagai catatan, tidak ada register yang menunjukan segmen ini oleh karena itu, pada setiap program EXE dimasukkan baris program berikut untuk menset DS sebagai permulaan segmen data:
            Mov ax, @data
            Mov ds, ax
Ø  Segmen stack.
Segmen stack mengikuti .MODEL, dan biasanya kita menyediakan 256 byte ruang stack. Register SS mengandung alamat segmen ini, dan SP mengacu pada alamat berikutnya setelah akhir stack. Stack akan bertambah kea rah bawah pada saat suatu nilai dimasukkan ke dalam stack. Jika SP mencapai 0000 maka stack berarti penuh.
Ø  Perintah.
Perintah TITLE mendefinisikan judul program sampai 128 karakter. Perintah DOSSEG memberitahu assembler untuk menempatkan segmen program dalam urutan standar yang digunakan bahasa tingkat tinggi.
Ø  Model memori.
Perintah .MODEL memilih standar model memori untuk program bahasa assembly. Model memori mungkin sebagai cetak biru 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.
Seacra umumpemilihan model memori berarti membuat pilihan antara kecepatan exsekusi optimal dan fleksibilitas ukuran program. Model memori yang membatasi semua data ke segmen tunggal 64 K, contohnya, menjamin bahwwa semua alamat data akan dekat, yaitu, 16-bit nilai. Data mungkin dapat diakses lebih cepat karena alamat 16-bit mungkin di load dengan satu intruksi mesin. Disisi lain, model memori yang mengizinkan kode untuk diperluas sampai 64 K berakibat bahwa beberapa subrutin akan berada pada segmen yang berbeda. Ini berarti bahwa alamat 32-bit harus di load kedalam CS dan register IP ketika subrutin dipanggil. Hal ini membutuhkan 2 intruksi mesin.
Berbagai macam memori model didefinisikan oleh jumlah byte yang digunakan untuk kode (intruksi) dan data (variable). Table berikut menunjukan rangkuman perbedaan antara berbagai tipe model:
Model
Penjelasan
Tiny
Kode dan data digabung harus <=64 K
Small
Kode <=64K, data <=64K
Medium
Data <=64K, kode ukuran sembarang
Compact
Kode <=64K, data ukuran sembarang
Large
Keduanya lebih besar dari 64 K
Huge
Sama seperti model LARGE hanya array boleh lebih dari 64K
Table Model Memori
Semua model, kecuali model tiny menghasilkan program EXE. Model tiny menghasilkan program COM. Peta file program Hello:
Start                stop                 length              name                class
00000H           00010H           00011H           _TEXT            CODE
00020H           0002FH           00010H           _DATA           DATA
00030H           0012FH           00100H           _STACK         STACK
Diagram segmen :
Misalkan program di load pada alamat absolute 20000:
Segmen           alamat absolute           nilai register segmen
Code                20000                          2000
                        (20h byte)                
Data                 20020                          2002
                        (10h byte)
Data                 20030                          2003
                        (100h byte)
Gambar Struktur segmen Hello.exe
Ø  Program yang dapat dieksekusi (executable program)
Untuk mendapatkan gambaran yang lebih baik tentang program yang dapat dieksekusi setelah diisikan DOS kedalam memori, lihatlah gambar struktur segmen hello diatas, yaitu profram HELLO.ASM, yang di assembly dan di-link ke bentuk HELLO.EXE. linker dapat menghasilkan file MAP, yang dengan baik menunjukan offset dan ukuran segmen program. Dalam contoh ini, segmen kode adalah 11h byte, segmen datanya 10h byte, dan panjang stacknya 100h byte.