bahasa asembler 1

Tampilkan postingan dengan label bahasa asembler 1. Tampilkan semua postingan
Tampilkan postingan dengan label bahasa asembler 1. Tampilkan semua postingan

bahasa asembler 1


 



mulgara

Jaymie Norris, pengelola Taman Nasional dan Satwa Liar mengatakan bahwa 

sebelumnya  sejak 100 tahun yang lalu Mulgara ekor puncak mirip tikus   ini hanya ditemukan melalui fragmen tulang fosil,  salah satu spesies marsupial di negara bagian New South Wales Australia  dianggap punah,namun akhir akhir ini Rebecca West dari Universitas New South Wales yang bekerja untuk proyek Wild Desert menemukan mulgara ekor puncak  di Gurun Australia ,namun  mulgara ekor puncak juga  ditemukan masih hidup di padang pasir Taman Nasional Sturt,  sudut barat laut New South Wales    Australia Tengah , kedua duanya sama sama  makhluk nokturnal yang mampu  beradaptasi dengan iklim gurun yang panas, warna bulu  dan ukuran kedua mulgara ini sama,kedua duanya sama sama diam di jaringan liang yang luas di bawah bukit pasir,  kedua duanya sama sama  hanya  muncul  kalau semua orang sudah pada tidur di malam hari  sambil kadangkala  berburu  reptil,  lipan , laba-laba,kecoa,tikus,kalajengking, kelabang, kaki seribu, jangkerik, tarantula, anak ayam, populasi mulgara menurun drastis  oleh sebab   munculnya penampakan sebagai  predator baru yang menelan mentah mentah  makanan mulgara , banyaknya masyarakat yang memanfaatkan kelinci, kucing,  rubah,untuk diternakan , sulit  menentukan berapa  mulgara ekor puncak yang tersisa ,

dua spesies mulgara di australia, yaitu mulgara ekor sikat dan mulgara ekor puncak 

dianggap sebagai spesies yang sama  baru dibuktikan  melalui pengujian genetik pada 2005 ,dua spesies mulgara di australia, yaitu mulgara ekor sikat dan mulgara ekor puncak mempunyai  susunan genetik yang berbeda, mulgara ekor puncak  mempunyai  warna berbeda di ujung ekornya,  ekornya tak selebat mulgara ekor sikat,  mulgara ekor puncak mempunyai 8 puting , mulgara ekor sikat mempunyai 6 puting ,




tikus berduri

 Perre-Henri Fabre, kepala  peneliti dari Center of Macroecology, Evolution, and Climate  University of Copenhagen , Museum Zoologi Bogor dan  Lembaga Ilmu Pengetahuan Indonesia (LIPI) menemukan dan menganalisa secara morfologi genetika tikus berduri.dahulu Alfred Wallace  setelah mengadakan penelitian di maluku,penelitian ini menginspirasi lahirnya teori evolusi,wallace menulis surat kepada Charles Darwin lalu menerbitkan  The Origin of Species, penemuan  ini mendukung pemikiran Wallace  mengenai perbedaan fauna dari timur dan barat wilayah Indonesia, yang dipisahkan oleh garis Wallace. 

sesuai nama tempat ditemukanya spesies tikus  tikus berduri atau  Boki Mekot, dengan membuat  selai kacang, yang ditaruh di liang dan  batang pohon ,tikus berduri ini bernama latin Halmaheramys bokimekot,

bahwa tikus ini tergolong genus dan spesies baru,tikus  ini mempunyai  bulu-bulu yang keras mirip duri,bagian perut berwarna kelabu terang,ujung ekornya berwarna putih,punggungnya  berwarna coklat,

 kebanyakan hewan  hewan di timur Indonesia memiliki  karakteristik Australia,namun ini tikus  menunjukkan ke karakteristikan asia



.Halaman  1




Didalam pemprograman   dengan bahasa assembler, bisa dipakai  berbagai  jenis bilangan. Jenis bilangan yang bisa dipakai , yaitu: Bilangan biner, oktaf, desimal dan hexadesimal. pengertian  pada  jenis-jenis bilangan ini

yaitu penting, sebab  akan sangat membantu pelajar  dalam pemprograman   yang  sebetulnya . 

sebetulnya  semua bilangan, data maupun program  itu sendiri akan diterjemahkan oleh komputer ke dalam bentuk biner. Jadi pengartian  data  dengan jenis bilangan apapun(Desimal, oktaf dan hexadesimal) akan selalu

diterjemahkan oleh komputer ke dalam bentuk biner. 

Bilangan biner yaitu bilangan yang hanya terdiri atas 2

kemungkinan(Berbasis dua), yaitu 0 dan 1. sebab  berbasis 2, maka  pengkorversian ke dalam bentuk desimal yaitu dengan mengalikan suku ke-N 

dengan 2N. Contohnya: bilangan biner 01112 = (0 X 23) + (1 X 22) + (1 X 21) +

(1 X 20) = 710. 

 semua. Bilangan Desimal yaitu jenis bilangan yang paling banyak dipakai dalam  kehidupan sehari-hari, sehingga kebanyakan pelajar  sudah tahu.  Bilangan desimal yaitu bilangan yang terdiri atas 10 buah angka(Berbasis 10), yaitu angka 0-9. Dengan basis sepuluh ini maka suatu angka dapat dijelaskan  dengan perpangkatan sepuluh. contoh  pada angka 12310 = (1 X

102) + (2 X 101) + (1 X 100). 

 

Bilangan oktal yaitu bilangan dengan basis 8, artinya angka yang  dipakai hanyalah antara 0-7. seperti dengan jenis bilangan yang lain,  suatu bilangan oktal dapat dikonversikan dalam bentuk desimal dengan

mengalikan suku ke-N dengan 8N. Contohnya bilangan 128 = (1 X 81) + (2 X 80) =

1010. 

Bilangan hexadesimal yaitu  bilangan yang berbasis 16. Dengan angka yang dipakai  berupa: 

 0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F. 

Dalam pemprograman   assembler, jenis bilangan ini boleh dikatakan yang  paling banyak dipakai . ini  dipicu  mudahnya pengkonversian bilangan

ini dengan bilangan yang lain, terutama dengan bilangan biner dan desimal.  sebab  berbasis 16, maka 1 angka pada hexadesimal memakai 4 bit. 

Pada assembler bilangan dibedakan lagi menjadi 2, yaitu

bilangan bertanda   dan tidak. Bilangan bertanda   yaitu bilangan yang memiliki  arti plus(+) dan minus(-), contoh  angka 17 dan -17. Pada bilangan tidak

bertanda  , angka negatif(yang mengandung tanda   '-') tidak  dikenal. Jadi

angka -17 tidak akan  dikenali sebagai angka -17, namun  sebagai angka lain. Kapan suatu bilangan perlakukan sebagai bilangan bertanda   dan tidak? Assembler akan selalu melihat pada Sign Flag, bila pada flag ini bernilai 0,

maka bilangan akan diperlakukan sebagai bilangan tidak bertanda  , sebaliknya  bila  flag ini bernilai 1, maka bilangan akan diperlakukan sebagai bilangan

bertanda  .  Pada bilangan bertanda   bit terakhir (bit ke 16) dipakai  sebagai tanda   

plus(+) atau minus(-). bila  pada bit terakhir bernilai 1 artinya bilangan 

itu  yaitu bilangan negatif, sebaliknya bila  bit terakhir bernilai 0,

artinya bilangan itu  yaitu bilangan positif,


+--------------------------------------------+ 

| >>>> Bilangan <<<< | 

+------------+---------------+---------------+ 

| Biner |Tidak Bertanda   | Bertanda   | 

+------------+---------------+---------------+ 

| 0000 0101 | + 5 | + 5 | 

| 0000 0100 | + 4 | + 4 | 

| 0000 0011 | + 3 | + 3 | 

| 0000 0010 | + 2 | + 2 | 

| 0000 0001 | + 1 | + 1 | 

| 0000 0000 | 0  |     0 |

| 1111 1111 | + 255 | - 1 | 

| 1111 1110 | + 254 | - 2 | 

| 1111 1101 | + 253 | - 3 | 

| 1111 1100 | + 252 | - 4 | 

| 1111 1011 | + 251 | - 5 | 

| 1111 1010 | + 250 | - 6 | 

+------------+---------------+---------------+ 

gambar  kode     Bilangan Bertanda   dan Tidak


M E M O R I 

Memori dengan komputer memiliki hubungan yang tak dapat dipisahkan, sebab  setiap komputer memerlukan memori sebagai tempat kerjanya. Memori ini  berfungsi untuk memuat program  dan juga sebagai tempat untuk menampung  hasil proses.  bahwa memori untuk menyimpan program  maupun hasil dari pekerjaan bersifat volatile yang berarti bahwa data yang disimpan  hanya  sebatas adanya aliran listrik. Jadi bila listrik mati maka hilang pulalah semua data yang ada di dalamnya. ini  memicu  diperlukannya media  penyimpan kedua yang biasanya berupa disket atau  hard disk. 

Pada IBM-PC ada  suatu bagian penting yang dinamakan  microprocessor atau   processor saja. Processor ini berfungsi untuk menangani keseluruhan

 dari kerja komputer pelajar . Pada processor inilah segala hal yang berkaitan  dengan kerja komputer diatur dan dibagi prioritasnya dengan baik agar tidak terjadi kesalahan yang lalu  akan memicu  

kacaunya informasi yang diperoleh.  Lama kelamaan tugas komputer tentu saja makin bertambah baik dari segi  kuantitas dan   kerumitannya. Sejalan dengan itu processor juga makin  dikembangkan. Processor yang baru sebetulnya  hanyalah perbaikan dan 

pengembangan dari yang versi lama sehingga semua instruksi yang berlaku di processor lama dapat pula dikerjakan oleh yang baru dengan tentu saja beberapa

keunggulan. sedang  processor yang kini banyak beredar di pasaran : 

- 8088 & 8086 : 

Ini yaitu  processor IBM-PC yang pertama sekali atau yang  dinamakan   XT. Processor 8088 memakai  jalur bus data 8 bit sedang  8086 memakai  16 bit. Perbedaan jalur bus ini memicu  perbedaan jumlah data yang dikirimnpada satu saat dan secara langsung memicu  speed 8086 berada di atas

8088. Baik 8088 atau  8086 mampu mengalamatkan memori hingga 1 MB. 

- 80286 : 

Versi pengembangan dari 8086. Pada 80286 ini beberapa instruksi baru ditambahkan. Selain itu dengan jalur bus yang sama dengan 8086, 80286

dirancang memiliki  speed di atas 8086. Selain itu 80286 dapat bekerja pada 2 mode yaitu mode real dan protected. Mode real pada 80286 dapat beroperasi sama seperti 8088 dan 8086 hanya

ada  perbedaan dalam hal speed. Mode real ini ditujukan  agar semua perangkat lunak  yang dapat dioperasikan pada 8088/8086 dapat pula dioperasikan dengan baik di 80286. Pada mode protected 80286 mampu mengalamatkan sampai 16 MB

memori. 

- 80386 : 

Processor 80386 yaitu  sesuatu yang sangat baru dibanding 80286 sebab bus data yang dipakai  di sini sudah 32 bit sehingga speednya juga jauh di atas

80286. Selain itu pada 80386 ditambahkan pula sebuah mode pemprograman   baru  yaitu mode virtual. Pada mode virtual ini 80386 mampu mengalamatkan sampai 4 GB memori. Sama seperti 80286, mode real ditujukan  untuk kompatibilitas 

dengan 8088/8086 dan mode protected untuk menjaga kompatibilitas dengan 80286. 

Memori yang ada pada komputer perlu diatur sedemikian rupa sehingga  mudah dalam pengaksesannya. Oleh sebab itu diciptakan  suatu metode yang efektif dalam pengorganisasiannya.

Memori komputer terbagi atas 16 blok dengan fungsi-fungsi khusus yang  sebagian besar yaitu sebagai RAM (Random Access Memory) yang berfungsi 

sebagai penyimpan bagi hasil pengolahan pada komputer itu sendiri. Untuk 

lebih jelasnya diberikan pembagian fungsi pada blok memori ini secara kasar 


 --------------------------------------------------- 

 block fungsi 

 --------------------------------------------------- 

 0 RAM 

 1 RAM 

 2 RAM 

 3 RAM 

 4 RAM 

 5 RAM 

 6 RAM 

 7 RAM


8 RAM 

 9 RAM 

 A EXTENDED VIDEO MEMORI 

 B EXTENDED VIDEO MEMORY 

 C PERLUASAN ROM 

 D FUNGSI LAIN 

 E FUNGSI LAIN 

 F BIOS & BASIC 

 --------------------------------------------------- 

gambar  kode    Pembagian blok memori IBM PC 

 

 bahwa baik 8086 atau  mode real 80286 dapat  mengalamatkan sampai 1 MB memori. 

namun  sebetulnya  baik 8086 atau  80286  yaitu procesor 16 bit. Banyaknya memori yang dapat dicatat atau dialamatkan  oleh procesor 16 bit yaitu maksimal 216 byte (=64 KB). Jadi bagaimana 8086

dan mode real 80286 mampu mengalamatkan sampai 1 MB memori ?.  ini  dapat dimungkinkan dengan adanya pengalamatan yang memakai 

sistem 20 bit walaupun sebetulnya  procesor itu hanya 16 bit. Dengan cara ini dapat dialamatkan 220 byte (=1 MB) memori.  namun  masih tetap ada satu kendala dalam pengalamatan 20 bit ini. Yaitu

bahwa sesuai dengan tipenya procesor ini hanya mampu mengakses 16 bit data pada satu kali akses time. Sebagai  solusinya  diciptakan  suatu metode pengalamatan 20 bit  yang dimasukkan ke dalam format 16 bit.  Pada metode pengalamatan ini baik 8086 atau  mode real 

80286 membagi ruang memori ke dalam segmen-segmen di mana besar 1 segmen  yaitu 64 KB (=216 byte). Jadi pada segmen 0000h(tanda   "h" menandakan  hexadesimal) ada  64 KB data, demikian juga  dengan segmen 0001h dan seterusnya. 

Sekarang bagaimana caranya agar setiap data yang tersimpan dalam satu  segmen yang besarnya 64 KB itu dapat diakses sendiri sendiri . Cara yang

dikembangkan yaitu dengan membagi-bagi setiap segmen menjadi bagian-bagian

yang dinamakan  offset. Dalam satu segmen ada  216 offset yang diberi nomor dari 0000h sampai FFFFh. Nomor offset selalu diukur relatif dari awal suatu segmen. bagaimana sebetulnya  letak suatu segmen dalam memori  komputer pelajar . Segmen 0000h berawal dari lokasi memori 0 hingga 65535 ( 64 KB

). Segmen 0001h berawal dari lokasi memori 16 (0010h) hingga 65551 (65535 +

16). Segmen 0002h berawal dari lokasi 32 hingga 65567. Demikian seterusnya. 

pelajar  lihat bahwa sistem penempatan segmen semacam ini akan memicu  ter- 

 Segmen Offset 


 0000 +--------------------+0000 

 | | 

 0001 +-----+-------------+0000 |0016 

 | | | 

 0002+-----+------------+0000 |0016 |0032 

 | | | | 

 0003+-----+-----------+0000 |0016 |0032 |0048 

 | | | | | 

 | | : : : 

 | : : : : 

 | : | | | 

 | | | +------+65535 

 : | | | 

 : | +------+65535 

 | | | 

 | +------+65535 

 | | 

 +-----------------+65535 

gambar  kode   Peta Overlapping Segmen


jadinya overlapping (tumpang-tindih) di mana lokasi offset 0010h bagi segmen

0000h  akan menjadi   offset 0000h bagi segmen 0001h. demikian juga  offset 

0011h bagi segmen 0000h  akan menjadi   offset 0001h bagi segmen 0001h. Dalam

pembahasan selanjutnya akan pelajar  lihat bahwa ada banyak nilai segmen:offset yang dapat dipakai  untuk menyatakan suatu alamat memori tertentu dipicu  adanya overlapping ini. 

Alamat yang memakai  sistem segmen:offset ini dinamakan alamat relatif sebab  sifat offset yang relatif pada  segmen. sedang  alamat memori yang sebetulnya  dinamakan  alamat absolut. ini  cara pengkonversian alamat relatif ke absolut. 

Pengkonversian dapat dilakukan dengan menggeser geser  nilai segmen 4 bit ke kiri dan lalu  dijumlahkan dengan nilai offset. Atau yang lebih sederhana yaitu dengan mengalikan nilai segmen dengan 24 (=10h) dan lalu  dijumlahkan dengan nilai offset. Cara ini dikembangkan dari besarnya selisih segmen yang satu dengan yang berikutnya yang sebesar 16 bit (=10h). 

Alamat relatif : 1357h:2468h 1356h:2478h 

13570 13560 

  2468  2478 

------- ------- 

Alamat absolut : 159D8h            159D8h 

Pada kedua contoh di atas tampak  jelas alamat relatif 1357h:2468h 

sebetulnya  menandakan  lokasi yang sama dalam memori dengan alamat relatif

1356h:2478h yang dinamakan  overlapping. 

Alamat yang overlapping ini memicu  sebuah alamat absolute dinyatakan  dengan alamat segmen:offset yang bervariasi sebanyak 2 pangkat 12

atau sebanyak 4096 variasi. 

Variasi untuk alamat absolute : 

0 - 15 dinyatakan  dengan 1 variasi 

16 - 31 dinyatakan  dengan 2 variasi 

32 - 48 dinyatakan  dengan 3 variasi 

 : 

 : 

65520 keatas dinyatakan  dengan 4096 variasi. 



Interupsi yaitu 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 melakukan  program  yang ada  disana. program 

yang melayani suatu interupsi dinamakan Interrupt Handler.  Setiap interrupt akan mengeksekusi interrupt handlernya masing-masingberdasar  nomornya. sedang  alamat dari masing- masing interupt handler tercatat di memori dalam bentuk array yang besar elemennya masing-masing 4 

byte. Keempat byte ini dibagi lagi yaitu 2 byte pertama berisi kode offset sedang  2 byte berikutnya berisi kode segmen dari alamat interupt handler

yang bersangkutan. Jadi besarnya array itu yaitu 256 elemen dengan ukuran elemen masing-masing 4 byte. Total keseluruhan memori yang dipakai yaitu

sebesar 1024 byte (256 x 4 = 1024) atau 1 KB dan disimpan dalam lokasi memori absolut 0000h sampai 3FFh. Array sebesar 1 KB ini dinamakan  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) yaitu interrupt BIOS dan standar di semua  komputer baik yang memakai  sistem operasi DOS atau bukan. Lokasi Interupt

Vector Table-nya ada di alamat absolut 0000h-007Fh. 

- Interupt 20h - FFh (32 - 255) yaitu interrupt DOS. Interrupt ini hanya ada 

pada komputer yang memakai  sistem operasi DOS dan Interupt Handler-nya di￾load ke memori oleh DOS pada saat DOS dipakai . Lokasi Interupt Vector Table￾nya ada di alamat absolut 07Fh-3FFh. 


+---------------------------------------------------------------+ 

| Nomor Nama Nomor Nama  

| Interupt Interupt Interupt Interupt

+---------------------------------------------------------------+ 


| *00h Divide By Zero 10h Video Service | 


| *01h Single Step 11h Equipment Check | 


| *02h Non MaskableInt(NMI) 12h Memory Size | 


| *03h Break point 13h Disk Service | 


| 04h Arithmatic Overflow 14h Communication (RS-232)| 


| 05h Print Screen 15h Cassette Service | 


| 06h Reserved 16h Keyboard Service | 


| 07h Reserved 17h Printer Service | 


| 08h Clock Tick(Timer) 18h ROM Basic | 


| 09h Keyboard 19h Bootstrap Loader | 


| 0Ah I/O Channel Action 1Ah BIOS time & date | 


| 0Bh COM 1 (serial 1) 1Bh Control Break | 


| 0Ch COM 2 (serial 2) 1Ch Timer Tick | 


| 0Dh Fixed Disk 1Dh Video Initialization | 


| 0Eh Diskette 1Eh Disk Parameters | 


| 0Fh LPT 1 (Parallel 1) 1Fh Graphics Char | 


+---------------------------------------------------------------+ 


gambar  kode   BIOS Interrupt


* Interrupt ini sudah  dipastikan kegunaannya oleh sistem untuk keperluan yang khusus , tidak boleh dirubah oleh pemrogram seperti yang lainnya. 

- DEVIDE BY ZERO : bila  terjadi pembagian dengan nol maka proses akan segera  dihentikan. 

- SINGLE STEP : Untuk melakukan  / mengeksekusi intruksi satu persatu. 

- NMI : Pelayanan pada  NMI (Non Maskable Interrupt) yaitu  interupsi yang tak dapat dicegah. 

- BREAK POINT : bila  suatu program  memicu  overflow flag menjadi 1  maka interrupt ini akan melayani pencegahannya dan memberi tanda   error.

,15)


+-------------------------------------------+ 

| Nomor Nama Interrupt | 

| Interrupt | 

+-------------------------------------------+ 


| 20h Terminate program  | 


| 21h DOS Function Services | 


| 22h Terminate Code | 


| 23h Ctrl-Break Code | 


| 24h Critical Error Handler | 


| 25h Absolute Disk Read | 


| 26h Absolute Disk Write | 


| 27h Terminate But Stay Resident | 


+-------------------------------------------+ 


gambar  kode    DOS Interrupt


Didalam pemprograman   dengan bahasa assembler pelajar  akan banyak sekali memakai  interupsi untuk menyelesaikan suatu tugas. REGISTER 

Dalam pemprograman  dengan bahasa Assembly, mau tidak mau kita  harus  berkaitan  dengan apa yang dinamakan sebagai Register. Lalu apakah yang

ditujukan  dengan register itu sebetulnya  ?.  Register yaitu  sebagian memori dari  mikroprosesor yang dapat diakses  dengan kecepatan yang sangat tinggi.

 Dalam melakukan pekerjaannya mikroprosesor selalu memakai  register-register sebagai  perantaranya, jadi  register dapat diibaratkan sebagai kaki dan tangannya mikroprosesor.  Register yang dipakai  oleh mikroprosesor dibagi menjadi 5 bagian

dengan tugasnya yang berbeda-beda pula, yaitu : 

Register yang termasuk dalam golongan  ini terdiri atas register CS,DS,ES dan SS yang masing-masingnya yaitu  register 16 bit. Register-register

dalam golongan  ini biasanya dipakai  untuk menandakan  alamat dari suatu  segmen. 

 Register CS(Code Segment) dipakai  untuk menandakan  tempat dari segmen yang sedang aktif, sedang  register SS(Stack Segment) menandakan  letak dari segmen yang dipakai  oleh stack. Kedua register ini sebaiknya tidak sembarang diubah sebab  akan memicu  kekacauan pada program  kita  nantinya.   Register DS(Data Segment) biasanya dipakai  untuk menandakan  tempat segmen yang mana  data-data pada program  disimpan. biasanya isi dari register ini tidak perlu diubah kecuali pada program  residen. Register ES(Extra Segment), 

sesuai dengan namanya yaitu suatu register bonus yang tidak memiliki  suatu  tugas khusus. Register ES ini biasanya dipakai  untuk menandakan  suatu

alamat di memory, contoh  alamat memory video. 

Pada prosesor 80386 ada  tambahan register segment 16 bit, yaitu

FS<Extra Segment> dan GS<Extra Segment>. 

Register yang termasuk dalam golongan  ini yaitu register SP,BP,SI dan  DI yang masing-masing terdiri atas 16 bit. Register- register dalam golongan

ini biasanya dipakai  sebagai penunjuk atau pointer pada  suatu lokasi  di memory.   Register SP(Stack Pointer) yang berpasangan dengan register segment

SS(SS:SP) dipakai  untuk mununjukkan alamat dari stack, sedang  register BP(Base Pointer)yang berpasangan dengan register SS(SS:BP) mencatat suatu alamat di memory tempat data. 

 Register SI(Source Index) dan register DI(Destination Index) biasanya dipakai  pada operasi string dengan mengakses secara langsung pada alamat di

memory yang ditunjukkan oleh kedua register ini. 

Pada prosesor 80386 ada  tambahan register 32 bit, yaitu ESP,EBP,ESI dan EDI. 

Register yang termasuk dalam golongan  ini yaitu register AX,BX,CX dan  DX yang masing-masing terdiri atas 16 bit. Register- register 16 bit dari

golongan  ini memiliki  suatu ciri khas, yaitu dapat dipisah menjadi 2 bagian yang mana  masing-masing bagian terdiri atas 8 bit,  Akhiran H menandakan  High sedang  akhiran L menandakan  Low. 


+ A X + + B X + + C X + + D X + 


+-+--+--+-+ +-+--+--+-+ +-+--+--+-+ +-+--+--+-+ 


| AH | AL | | BH | BL | | CH | CL | | DH | DL | 


+----+----+ +----+----+ +----+----+ +----+----+ 


gambar  kode    General purpose Register


biasanya register-register dalam golongan  ini dapat dipakai  untuk  berbagai keperluan, walaupun demikian ada pula pemakaian  khusus dari masing￾masing register ini yaitu : 

 Register AX, secara khusus dipakai  pada operasi aritmatika terutama dalam operasi pembagian dan pengurangan. 

 Register BX, biasanya dipakai  untuk menandakan  suatu alamat offset dari suatu segmen. 

 Register CX, dipakai  secara khusus pada operasi looping yang mana  register ini menentukan berapa banyaknya looping yang akan terjadi. 

 Register DX, dipakai  untuk menampung sisa hasil pembagian 16 bit.  Pada prosesor 80386 ada  tambahan register 32 bit, yaitu EAX,EBX,ECX dan EDX.

Register IP berpasangan dengan CS(CS:IP) menandakan  alamat dimemory  tempat dari intruksi(perintah) selanjutnya yang akan dieksekusi. Register IP juga yaitu  register 16 bit. Pada prosesor 80386 dipakai  register EIP  yaitu  register 32 bit. 

Sesuai dengan namanya Flags(Bendera) register ini menandakan  kondisi dari suatu keadaan< ya atau tidak >. sebab  setiap keadaan dapat dipakai  1

bit saja, maka sesuai dengan jumlah bitnya, Flags register ini mampu memcatat  sampai 16 keadaan. sedang  flag yang ada  pada mikroprosesor 8088 keatas yaitu : 

- OF <OverFlow Flag>. bila  terjadi OverFlow pada operasi aritmatika, bit ini  akan bernilai 1. 

- SF <Sign Flag>. bila  dipakai  bilangan bertanda   bit ini akan bernilai 1 

- ZF <Zero Flag>. bila  hasil operasi menghasilkan nol, bit ini akan  bernilai 1. 

- CF <Carry Flag>. bila  terjadi borrow pada operasi pengurangan atau carry 

pada penjumlahan, bit ini akan bernilai 1. 


0F 0E 0D 0C 0B 0A 09 08 07 06 05 04 03 02 01 00 


+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 


| |NT| IOPL|OF|DF|IF|TF|SF|ZF| |AF| |PF| |CF| 


+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+ 


gambar  kode   Susunan Flags Register 8088 


- PF <Parity Flag>. dipakai  untuk menandakan  paritas bilangan. Bit ini akan nbernilai 1 bila bilangan yang dihasilkan yaitu  bilangan genap. 

- DF <Direction Flag>. dipakai  pada operasi string untuk menandakan  arah proses. 

- IF <Interrupt Enable Flag>. CPU akan mengabaikan interupsi yang terjadi bila   bit ini 0. 

- TF <Trap Flag>. dipakai  terutama untuk Debugging, dengan operasi step by step

- AF <Auxiliary Flag>. dipakai  oleh operasi BCD, seperti pada perintah AAA. 

- NT <Nested Task>. dipakai  pada prosesor 80286 dan 80386 untuk menjaga  jalannya interupsi yang terjadi secara beruntun. 

- IOPL <I/O Protection level>. Flag ini terdiri atas 2 bit dan dipakai  pada   prosesor 80286 dan 80386 untuk mode proteksi. 

sedang  susunan dari masing-masing flag didalam flags register dapat kita 

 Pada prosesor 80286 dan 80386 keatas ada  beberapa  tambahan pada flags register, yaitu : 

- PE <Protection Enable>. dipakai  untuk mengaktifkan mode proteksi. flag ini 

akan bernilai 1 pada mode proteksi dan 0 pada mode

real. 

- MP <Monitor Coprosesor>. dipakai  bersama flag TS untuk menangani  terjadinya intruksi WAIT. 

- EM <Emulate Coprosesor>. Flag ini dipakai  untuk mensimulasikan coprosesor  80287 atau 80387. 

- TS <Task Switched>. Flag ini tersedia pada 80286 keatas. 

- ET <Extension Type>. Flag ini dipakai  untuk menentukan jenis coprosesor  80287 atau 80387. 

- RF <Resume Flag>. Register ini hanya ada  pada prosesor 80386 keatas. 

- VF <Virtual 8086 Mode>. Bila flag ini bernilai 1 pada saat mode proteksi,  mikroprosesor akan memungkinkan dijalankannya aplikasi mode real pada mode proteksi. Register ini  hanya ada  pada 80386 keatas.

Untuk menulis nulis  source code   program  assembly bisa kita  pakai   editor, contoh  SideKick, WordStar dan Word Perfect. source code  yang diketikkan harus berupa file ASCII, file ini bisa kita  hasilkan melalui WordStar dengan file 'NON DOCUMEN', atau dengan SideKick. 

Untuk meyakinkan bahwa source code  yang kita  buat yaitu file ASCII, bisa kita  coba ketikkan perintah Type pada A>. Bila file yang tampak  dengan

perintah type sama persis dengan yang kita  ketikkan pada editor, tanpa  tambahan huruf   yang acak, maka file itu  yaitu file ASCII. source code  untuk assembly harus berektensi .ASM. 

source code  ASCII yang sudah  kita  ketikkan perlu dicompile kebentuk file obyek  dengan extensi .OBJ, dari file obyek  inilah nantinya dapat dijadikan  kebentuk file .EXE atau .COM.  Untuk mengcompile source code , contoh  file COBA.ASM menjadi file obyek  dengan extensi .OBJ bisa kita  pakai  file TASM.EXE dengan mengetikkan: 


C:\>tasm coba 


Turbo Assembler Version 2.0 Copyright © 1980-

1989  Borland international computer  


Assembling file: coba.ASM 

Error messages: None 

Warning messages: None 

Passes: 1 

Remaining memory: 307k 


C:\>dir coba.* 


 Volume in drive C is yangko  

 Directory of C:\ 

COBA OBJ 128 08-12-94 10:42p 

COBA ASM 128 08-12-94 10:41p 

 2 file(s) 246             bytes 

 1,085,952,900,700  bytes free



File obyek  yang sudah  terbentuk dengan TASM, belum dapat dieksekusi secara langsung. Untuk membuat file obyek  ke bentuk file yang dapat  dieksekusi(ektensi .COM atau .EXE) bisa kita  pakai  file TLINK.EXE. 

Bila source program  yang kita  buat dalam bentuk EXE maka untuk membentuk file dengan ektensi EXE bisa kita  ketikkan : 


C:\>tlink coba 


Turbo Link Version 3.0 Copyright  © 1981

1990 Borland international computer 


Bila source program  yang dibuat yaitu file COM, maka bisa kita  ketikkan: 


C:\>tlink/t coba 


Turbo Link Version 3.0 Copyright © 1980

1990 Borland international computer 


program  dengan ektensi COM dan EXE memiliki  berbagai perbedaan yang  menonjol , antara lain : 

program  EXE : - Lebih panjang dari file COM 

 - Lebih lambat dibanding file COM 

 - Bisa memakai  lebih dari 1 segmen 

 - Ukuran file tak terbatas sesuai dengan 

 ukuran memory. 

 - mudah mengakses data atau procedure pada 

 segment yang lain. 

 - Tidak bisa dibuat dengan DEBUG ,

program  COM : - Lebih pendek dari file EXE 

 - Lebih cepat dibanding file EXE 

 - Hanya dapat memakai  1 segmen 

 - Ukuran file maksimum 64 KB (ukuran satu  segment) 

 - sulit untuk mengakses data atau procedure 

 yang terletak pada segment yang lain. 

 - 100h byte pertama yaitu  PSP(program  

 Segment Prefix) dari program  itu . 

 - Bisa dibuat dengan DEBUG 


Assembler membolehkan  pemakaian  beberapa bentuk angka , yaitu : 


HEXADESIMAL

Untuk menuliskan angka dalam bentuk hexadesimal(0..9,A..F), harus  ditambahkan tanda   'H' pada akhir angka itu . Perlu diperhatikan bahwa bila

angka pertama dari hexa berupa huruf   (A..F) maka angka nol harus ditambahkan didepannya. Bila ini  tidak dilakukan, assembler akan menganggapnya sebagai suatu label, bukannya sebagai nilai hexa. Contoh penulisan yang benar: 0A12H, 

2A02H. 


huruf   

Penulisan huruf    atau string diapit oleh tanda   petik dua (") atau tanda   petik satu('), Contoh: ' Ini yaitu huruf    '. 


DESIMAL

Untuk menuliskan angka dalam bentuk desimal, bisa dipakai  tanda   'D'  pada akhir angka itu  atau bisa juga tidak diberi tanda   sama sekali, 

contoh : 298D atau 298 saja.


BINER

Untuk menuliskan angka dalam bentuk biner(0..1), harus ditambahkan tanda   'B' pada akhir angka itu , contoh : 01100111B. 



Label   diartikan  dengan ketentuan akhir dari nama label itu  harus berupa tanda   titik dua (:). Pemberian nama label bisa dipakai : 

- Huruf : A..Z (Huruf besar dan kecil tidak dibedakan) 

- Angka : 0..9 

- huruf    khusus : @ . _ $ 

Nama pada label tidak boleh ada  spasi dan didahului oleh angka, Contoh dari penulisan label yang benar: mulai: MOV CX,7. Nama label

terpanjang yang dapat dikenali oleh assembler yaitu 31 huruf   . 


Untuk memberi  komentar pada source code  dipakai  tanda   ';'. Apapun  yang dtuliskan dibelakang tanda   ';' akan dianggap sebagai komentar, Contoh :

mulai: MOV BX,7 ; berikan nilai 7 pada BX 


Perintah MOV dipakai  untuk menyalin  nilai atau angka menuju suatu  register,variabel atau memory. sedang  syntax untuk perintah MOV ini yaitu : 

MOV Tujuan,Asal

contoh :  : MOV AL,9 ; masukkan nilai 9 pada AL. 

 MOV AH,AL ; nilai AL=9 dan AH=9 

 MOV AX,9 ; AX=AH+AL hingga AH=0 dan AL:=9


Pada baris pertama(MOV AL,9), pelajar  memberi  nilai 9 pada register AL.  lalu  pada baris kedua(MOV AH,AL) pelajar  menyalinkan  nilai register AL untuk  AH. Jadi sesudah  operasi ini register AL akan tetap bernilai 9, dan register

AH akan sama nilainya dengan AL atau 9. Pada baris ketiga(MOV AX,9), pelajar 

memberi  register AX nilai 9. sebab  AX terdiri atas AH dan AL, maka register AH akan bernilai 0, sedang  AL akan bernilai 9.  Perintah MOV akan menyalinkan  nilai pada sumber untuk dimasukan ke Tujuan, nilai sumber tidak  berubah. Inilah sebabnya MOV(E) akan pelajar   terjemahkan disini dengan menyalin , dan bukannya memindahkan.  Didalam pemprograman   assambler, pelajar  akan banyak  memakai 

interupsi untuk membantu pelajar  dalam mengerjakan suatu pekerjaan. Untuk menghasilkan suatu interupsi dipakai  perintah INT dengan syntax: 

INT NoInt 

Dengan NoInt yaitu nomor interupsi yang ingin dihasilkan. contohnya  bila pelajar  ingin menghasilkan interupsi 21h, bisa dituliskan dengan:

INT 21h, maka interupsi 21h akan segera terjadi.


Untuk membuat program  .COM yang hanya memakai  1 segment, bisa kita   buat dengan model program  seperti gambar  kode   6.1. Bentuk yang dipakai  disini 

yaitu bentuk program  yang dianjurkan(Ideal). Dipilihnya bentuk program  idealprogram  ideal ini , prosesnya lebih cepat dan lebih mudah dipakai 

oleh berbagai bahasa tingkat tinggi yang terkenal(Turbo Pascal dan C). 

 ----------------------------------------------------------- 

 .MODEL SMALL 

 .CODE 

 ORG 100H

 Label1 : JMP Label2 

 +---------------------+ 

 | TEMPAT DATA program  | 

 +---------------------+ 

 Label2 : +---------------------+ 

 | TEMPAT program  | 

 +---------------------+ 

 INT 20H 

 END Label1 

 ----------------------------------------------------------- 

gambar  kode    Model program  COM

agar  lebih jelas bentuk dari program  ideal, kita  telusuri  lebih lanjut dari bentuk program  ini. 

MODEL SMALL

tanda   directive ini dipakai  untuk memberitahukan kepada assembler bentuk memory yang dipakai  oleh program  pelajar . agar  lebih jelas model-model

yang bisa dipakai  yaitu : 

- TINY

bila  program  kita  hanya memakai  1 segment seperti program  COM. Model ini disediakan khusus untuk program  COM. 

- SMALL

bila  data dan code yang dipakai  oleh program  kurang dari ukuran 1 segment atau 64 KB. 

- MEDIUM

bila  data yang dipakai  oleh program  kurang dari 64 KB namun  code yang dipakai  bisa lebih dari 64 KB.

- COMPACT

bila  data yang dipakai  bisa lebih besar dari 64 KB namun  codenya kurang dari 64 KB. 

- LARGE

bila  data dan code yang dipakai oleh program  bisa lebih dari 64 KB. 

- HUGE

bila  data, code atau  array yang dipakai  bisa lebih dari 64 KB.  mengapa pada program  COM yang dibuat  dipakai  model SMALL dan bukannya TINY ? ini  dipicu    banyak dari compiler bahasa tingkat tinggi yang tidak bisa berkomunikasi dengan model 

TINY, sehingga pelajar  memakai  model SMALL sebagai solusinya . 

tanda   directive ini dipakai  untuk memberitahukan kepada assemble  bahwa pelajar  akan mulai memakai  Code Segment-nya disini. Code segment ini 

dipakai  untuk menyimpan program  yang nantinya akan dijalankan. 

Pada program  COM perintah ini akan selalu dipakai . Perintah ini ORG 100h dipakai  untuk memberitahukan assembler agar  program  pada saat dijalankan(diload ke memory) ditaruh mulai pada offset ke 100h(256) byte.    bahwa pelajar  menyediakan 100h byte kosong pada saat program  dijalankan. 100h byte kosong ini nantinya akan ditempati oleh PSP(program 

Segment Prefix) dari program  itu . PSP ini dipakai  oleh DOS untuk  mengendalikan  jalannya program  itu . Perintah JMP(JUMP) ini dipakai  untuk melompat menuju tempat yang  ditunjukkan oleh perintah JUMP. sedang  syntaxnya yaitu: 

JUMP Tujuan . 

yang mana  tujuannya dapat berupa label seperti yang dipakai  pada bagan  diatas. Perintah JUMP yang dipakai  pada bagan diatas ditujukan  agar melewati

tempat data program , sebab  bila  tidak ada perintah JUMP ini maka data program  akan ikut dieksekusi sehingga kemungkinan besar akan memicu  program  kita  menjadi Hang. 

 Perintah INT yaitu suatu perintah untuk menghasilkan suatu interupsi dengan syntax: 

INT NoInt

Interupsi 20h berfungsi untuk mengakhiri program  dan menyerahkan kendali  sepenuhnya kepada Dos. Pada program  COM cara ini bukanlah satu-satunya namun  cara inilah yang paling efektif untuk dipakai . Bila kita  lupa untuk  mengakhiri sebuah program  maka program  kita  tidak akan tahu kapan harus

selesai, ini  akan memicu  komputer menjadi hang.

Bila dihasilkan interupsi 21h apa yang akan dikerjakan oleh komputer ?. Jawabnya, ada banyak sekali kemungkinan. Pada saat terjadi interupsi 21h maka 

pertama-tama yang dilakukan komputer yaitu melihat isi atau nilai apa yang ada  pada register AH. contoh  bila nilai AH yaitu 2 maka komputer akan

mencetak sebuah huruf   , berdasar  kode ASCII yang ada  pada register DL. Bila nilai pada register AH bukanlah 2, pada saat dilakukan interupsi 21h 

maka yang dikerjakaan oleh komputer akan lain lagi. 

sehingga  pelajar  bisa mencetak sebuah huruf    yang diinginkan dengan meletakkan angka 2 pada register AH dan meletakkan kode ASCII dari

huruf    yang ingin dicetak pada register DL sebelum menghasilkan interupsi   21h. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

Proses : 

 MOV AH,02h ; Nilai servis ntuk mencetak huruf    

 MOV DL,'A' ; DL = huruf    ASCII yang akan dicetak 

 INT 21h ; Cetak huruf    !! 

 INT 20h ; Selesai ! kembali ke DOS 

END Proses 


 program  Mencetak sebuah huruf    

Sesudah  program . kita  ketik compile-lah dengan memakai  TASM.EXE dengan perintah : 


 C:\>tasm a0 


 Turbo Assembler Version 2.0 Copyright © 1980  1990 

 Borland international computer  


 Assembling file: a0.ASM 

 Error messages: None 

 Warning messages: None 

 Passes: 1 

 Remaining memory: 306k 


 C:\>dir a0.* 


 Volume in drive C is yangko  

 Directory of C:\ 

 A0 ASM 506 08-14-94 3:56p 

 A0 OBJ 179 08-14-94 11:24p 

 2 file(s) 685     bytes

1,267,200 ,600 bytes free


Sampai disini sudah dihasilkan suatu file obyek  dari KAL.ASM yang siap  dijadikan file COM(sebab  pelajar  membuat file dengan format program  COM). Untuk 

itu lakukanlah langkah kedua, dengan perintah : 


 C:\>tlink/t a0 


 Turbo Link Version 3.0 Copyright (© 1980-1990  

 Borland international computer  


 C:\>dir a0.* 


 Volume in drive C is yangko  

 Directory of C:\ 


 A0 ASM 506 08-14-94 3:56p 

 A0 OBJ 179 08-14-94 11:26p 

 A0 MAP 229 08-14-94 11:26p 

 A0 COM 8 08-14-94 11:26p 

 4 file(s) 922      bytes 

 1,266,176,900  bytes free


Sesudah  kedua proses itu selesai maka dihasilkanlah suatu program  COM  yang sudah siap untuk dijalankan. File-file yang tidak dipakai  bisa kita  

hapus. Bila program   dijalankan maka pada layar akan ditampilkan 


C:\>A0 


 A


pelajar  lihat disini bahwa huruf    yang tercetak yaitu yang sesuai dengan kode ASCII yang ada pada register DL. Sebagai latihan cobalah kita  ubah

register DL dengan angka 65 yaitu  kode ASCII huruf    'A'. Hasil yang diperoleh  yaitu sama. 


Sebuah huruf    ditambah  dengan warna tentunya akan lebih menarik. Untuk itu kita  bisa memakai  interupsi ke 10h dengan aturan pemakaiannya : 


 INPUT 

 AH = 09h 

 AL = Kode ASCII dari huruf    yang akan dicetak 

 BH = Nomor halaman(0 untuk halaman 1) 

 BL = Atribut atau warna dari huruf    yang akan dicetak 

 CX = Banyaknya huruf    itu  akan dicetak 

Sesudah  semua register dimasukkan nilainya maka lakukanlah interupsi 

10h.  ,bahwa interupsi ini mencetak huruf    tanpa menggerakkan kursor. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

Proses : 

 MOV AH,09h ; Nilai servis untuk mencetak huruf    

 MOV AL,'A' ; AL = huruf    yang akan dicetak 

 MOV BH,00h ; Nomor Halaman layar 

 MOV BL,93h ; Warna atau atribut dari huruf    

 MOV CX,03h ; Banyaknya huruf    yang ingin dicetak 

 INT 10h ; lakukan  !!! 

 INT 20h ; Selesai ! kembali ke DOS 

END Proses 


program  Mencetak huruf    ditambah   atributnya

Bila program  dieksekusi maka akan ditampilkan huruf 'A' sebanyak 3 kali dengan warna dasar biru kedip dan warna tulisan Cyan(sesuai dengan nilai  register BL). 


 B:\>A1 


 AAA


kita  bisa merubah-rubah register AL dan BL untuk merubah huruf    dan  warna yang ingin dicetak. 


Perintah LOOP dipakai  untuk melakukan suatu proses yang berulang￾ulang. sedang  syntax dari perintah ini yaitu : 


 LOOP Tujuan


Tujuan dapat berupa suatu label yang sudah  didiartikan , contoh: 

 MOV CX,3 ; Banyaknya pengulangan yang dilakukan 

 Ulang : INT 10h ; Tempat terjadinya pengulangan 

 LOOP Ulang ; Lompat ke label 'Ulang'

Pada proses pengulangan dengan perintah LOOP, register CX berperan  yang mana  register ini dijadikan sebagai counter/penghitung pada  banyaknya looping yang boleh terjadi. Setiap ditemui perintah LOOP,

maka register CX akan dikurangi dengan 1 terlebih dahulu, lalu  akan  dilihat apakah CX sudah mencapai 0. Proses looping akan selesai bila nilai pada register CX mencapai nol. Seperti pada contoh diatas, maka interupsi 10h  akan dihasilkan sebanyak 3 kali(sesuai dengan nilai CX).  bahwa jangan sampai kita  menaruh CX kedalam proses LOOP sebab  ini  akan memicu  nilai CX diSET terus sehingga proses

looping tidak bisa berhenti. 

TRICK:

Bila kita  menetapkan nilai CX menjadi nol pada saat pertama kali sebelum dilakukan loop, maka kita  akan memperoleh  proses looping yang terbanyak. Hal 

ini dipicu  proses pengurangan 0 dengan 1 akan menghasilkan nilai FFFFh(-

1), Contoh : 

 MOV CX,00 

Ulang: LOOP Ulang 


Untuk mencetak beberapa huruf   , bisa kita  pakai  proses looping.Sebagai contoh dari pemakaian  looping ini bisa dilihat pada program ini 

 .MODEL SMALL 

 .CODE 

 ORG 100h 

Proses : 

 MOV AH,02h ; Nilai servis 

 MOV DL,'A' ; DL=huruf    'A' atau DL=41h 

 MOV CX,10h ; Banyaknya pengulangan yang akan 

 Ulang : 

 INT 21h ; Cetak huruf    !! 

 INC DL ; Tambah DL dengan 1 

 LOOP Ulang ; Lompat ke Ulang 

 INT 20h 

END Proses 


program   Pengulangan dengan perintah LOOP

Bila program  dijalankan maka akan ditampilkan : 


 ABCDEFGHIJKLMNOP


 Perintah INC DL akan menambah register DL dengan 1, seperti intruksi , DL:=DL+1 dalam Pascal. Lebih jauh mengenai operasi aritmatika(INC) 


Untuk menambah dalam bahasa assembler dipakai  perintah ADD dan ADC dan  INC. Perintah ADD dipakai  dengan syntax : 


 ADD Tujuan,Asal


Perintah ADD ini akan menambahkan nilai pada Tujuan dan Asal. Hasil yang diperoleh  akan ditaruh pada Tujuan, dalam bahasa pascal sama dengan instruksi  Tujuan:=Tujuan + Asal. contoh :  : 

 MOV AH,15h ; AH:=15h 

 MOV AL,4 ; AL:=4 

 ADD AH,AL ; AH:=AH+AL, jadi AH=19h

 ,bahwa pada perintah ADD ini antara Tujuan dan Asal 

harus memiliki  daya tampung yang sama, contoh  register AH(8 bit) dan AL(8bit), AX(16 bit) dan BX(16 bit).    ,, apa yang akan terjadi bila Tujuan tempat hasil penjumlahan disimpan tidak mencukupi seperti pertambahan 1234h dengan F221h. 

 1234 h Biner --> 0001 0010 0011 0100 

 F221 h Biner --> 1111 0010 0010 0001 

 ---------- + --------------------- + 

 10455 h 1 0000 0100 0101 0101 

Pada pertambahan diatas dapat dilihat bahwa pertambahan bilangan 1234 dengan F221 akan menghasilkan nilai 10455. agar  lebih jelas dapat kita  lihat pada pertambahan binernya dihasilkan bit ke 17, padahal register terdiri atas 16 bit saja. Operasi pertambahan yang demikian akan menjadikan carry flag  menjadi satu, Contoh : 

 MOV AX,1234h ; NIlai AX:=1234h dan carry=0 

 MOV BX,0F221h ; Nilai BX:=F221h dan carry=0 

 ADD AX,BX ; Nilai AX menjadi 0455h dan carry=1


 Perintah ADC dipakai  dengan cara yang sama pada perintah ADD, yaitu : 

ADC Tujuan,Asal

Perbedaannya pada perintah ADC ini Tujuan tempat menampung hasil  pertambahan Tujuan dan Asal ditambah lagi dengan carry flag (Tujuan:=Tujuan+Asal+Carry). Pertambahan yang demikian bisa memecahkan masalah seperti yang pernah pelajar  kemukakan, seperti pertambahan pada bilangan

12345678h+9ABCDEF0h. 

   , bahwa satu register hanya mampu menampung 16 bit, maka untuk pertambahan seperti yang diatas bisa kita  pakai  perintah ADC untuk memecahkannya, Contoh: 

 MOV AX,1234h ; AX = 1234h CF = 0 

 MOV BX,9ABCh ; BX = 9ABCh CF = 0

MOV CX,5678h ; BX = 5678h CF = 0 

 MOV DX,0DEF0h ; DX = DEF0h CF = 0 

 ADD CX,DX ; CX = 3568h CF = 1 

 ADC AX,BX ; AX = AX+BX+CF = ACF1

Hasil penjumlahan akan ditampung pada register AX:CX yaitu ACF13568h. 

sedang  flag-flag yang terpengaruh oleh perintah ADD dan ADC ini yaitu 

CF,PF,AF,ZF,SF dan OF. 


Perintah INC(Increment) dipakai  khusus untuk pertambahan dengan 1. Perintah INC hanya memakai  1 byte memory, sedang  perintah ADD dan ADC

memakai  3 byte. Oleh sebab itu bila kita  ingin melakukan operasi pertambahan dengan 1 pakai lah perintah INC. Syntax pemakainya yaitu : 

INC Tujuan 

Nilai pada tujuan akan ditambah dengan 1, seperti perintah Tujuan:=Tujuan+1 dalam Turbo Pascal. Tujuan disini dapat berupa suatu register

atau  memory. Contoh : perintah INC AL akan menambah nilai di register AL  dengan 1. sedang  flag yang terpengaruh oleh perintah ini yaitu OF,SF,ZF,AF

dan PF. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

 Proses : 

 MOV AH,15h ; AH:=15h 

 MOV AL,4 ; AL:=4 

 ADD AH,AL ; AH:=AH+AL, jadi AH=19h 

 MOV AX,1234h ; NIlai AX:=1234h dan carry=0 

 MOV BX,0F221h ; Nilai BX:=F221h dan carry=0 

 ADD AX,BX ; AX:=AX+BX, jadi nilai AX=0455h 

 MOV AX,1234h ; AX = 1234h CF = 0 

 MOV BX,9ABCh ; BX = 9ABCh CF = 0 

 MOV CX,5678h ; BX = 5678h CF = 0 

 MOV DX,0DEF0h ; DX = DEF0h CF = 0 

 ADD CX,DX ; CX = 3568h CF = 1 

 ADC AX,BX ; AX = AX+BX+CF = ACF1 

 INC AL ; AL:=AL+1, nilai pada AL ditambah 1 

 INT 20h 

END Proses


program  Operasi penambahan

Sesudah  kita  selesai mengetikkan program   jadikanlah program  COM dengan tasm dan tlink/t.Sesudah  itu cobalah untuk melihat kebenaran dari apa

yang sudah diberikan dengan memakai  debug. Pertama-tama ketikkanlah : 


C:\>debug Tambah.com 


-r < tekan enter > 


AX=0000 BX=0000 CX=0030 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=0100 NV UP EI PL NZ NA PO NC 

3597:0100 B415 MOV AH,15 


-t < tekan enter > 


 Penekanan "r" pada saat pertama kali dipakai  untuk melihat nilai pada semua register. Pada baris pertama dapat kita  lihat register yang dinamakan 

sebagai general purpose(AX,BX,CX dan DX). Register SP yang dipakai  pada 

operasi stack menandakan  nilai FFFE(akhir dari Segment), jadi operasi stack 

nantinya akan ditaruh pada posisi itu .  Pada baris kedua dapat kita  lihat keempat register segment, yaitu  DS,ES,SS dan CS. Keempat register segment menandakan  nilai yang sama yaitu 

3597(mungkin berbeda pada komputer kita ). ini  dipicu  program  pelajar yaitu program  com yang hanya memakai  1 segment. Pada baris kedua dapat 

juga kita  lihat register IP bernilai 100h. Register IP menandakan  bahwa pelajar  sekarang sedang berada pada offset ke 100h dari segment aktif(CS:IP atau 

3597:100).  Pada baris ketiga dapat kita  lihat 3597:0100, nilai ini menandakan bpasangan dari CS:IP. Sesudah  itu dapat kita  lihat nilai B415 yang menujukkan isi dari alamat 3597:0100 yaitu B4 sedang  isi dari alamat 3597:1001 yaitu

15. Nilai B415 ini sebetulnya  yaitu  suatu bahasa mesin untuk instruksi MOV  AH,15. Jadi bahasa mesin untuk perintah "MOV AH,nilai" yaitu B4 ditambah 

nilai itu . Dari nilai B415 ini dapat diketahui bahwa perintah MOV akan bmemakai  2 byte di memory. 

Sesudah  itu tekanlah 't' untuk mengeksekusi intruksi yang ada  pada alamat yang ditunjukkan CS:IP(MOV AH,15). Sesudah  kita  menekan 't' maka akan 

ditampilkan hasil sesudah  intruksi "MOV AH,15" dieksekusi : 

AX=1500 BX=0000 CX=0030 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=0102 NV UP EI PL NZ NA PO NC 

3597:0102 B004 MOV AL,04 

-t < enter > 

tampak  bahwa nilai AX berubah dari 0000 menjadi 1500 sesudah  memperoleh  perintah MOV AH,15. Tekanlah 't' ditambah  enter untuk melihat perubahan nilai  pada register-register yang bersangkutan. 

AX=1504 BX=0000 CX=0030 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=0104 NV UP EI PL NZ NA PO NC 

3597:0104 02E0 ADD AH,AL 

-t < enter > 

AX=1904 BX=0000 CX=0030 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000

DS=3597 ES=3597 SS=3597 CS=3597 IP=0106 NV UP EI PL NZ NA PO NC 

3597:0106 B83412 MOV AX,1234 

-t < enter > 

AX=1234 BX=0000 CX=0030 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=0109 NV UP EI PL NZ NA PO NC 

3597:0109 BB21F2 MOV BX,F221 

-t < enter > 

AX=1234 BX=F221 CX=0030 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=010C NV UP EI PL NZ NA PO NC 

3597:010C 03C3 ADD AX,BX 

-t < enter > 

AX=0455 BX=F221 CX=0030 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=010E NV UP EI PL NZ NA PE CY 

3597:010E B83412 MOV AX,1234 

-t < enter > 

AX=1234 BX=F221 CX=0030 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=0111 NV UP EI PL NZ NA PE CY 

3597:0111 BBBC9A MOV BX,9ABC 

-t < enter > 

AX=1234 BX=9ABC CX=0030 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=0114 NV UP EI PL NZ NA PE CY 

3597:0114 B97856 MOV CX,5678 

-t < enter > 

AX=1234 BX=9ABC CX=5678 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=0117 NV UP EI PL NZ NA PE CY 

3597:0117 BAF0DE MOV DX,DEF0 

-t < enter > 

AX=1234 BX=9ABC CX=5678 DX=DEF0 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=011A NV UP EI PL NZ NA PE CY 

3597:011A 03CA ADD CX,DX 

-t < enter > 

AX=1234 BX=9ABC CX=3568 DX=DEF0 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=011C NV UP EI PL NZ NA PO CY 

3597:011C 13C3 ADC AX,BX 

-t < enter > 

AX=ACF1 BX=9ABC CX=3568 DX=DEF0 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=011E NV UP EI NG NZ AC PO NC 

3597:011E FEC0 INC AL 

-t < enter > 

AX=ACF2 BX=9ABC CX=3568 DX=DEF0 SP=FFFE BP=0000 SI=0000 DI=0000 

DS=3597 ES=3597 SS=3597 CS=3597 IP=0120 NV UP EI NG NZ NA PO NC 

3597:0120 CD20 INT 20 

-Q < enter > 


Pengetikan "Q" mengartikan  bahwa pelajar  ingin keluar dari lingkungan debug 

dan akan kembali ke a:\>. 


Untuk Operasi pengurangan dapat dipakai  perintah SUB dengan syntax: 

SUB Tujuan,Asal

Perintah SUB akan mengurangkan nilai pada Tujuan dengan Asal. Hasil yang diperoleh  akan ditaruh pada Tujuan, dalam bahasa pascal sama dengan instruksi 

Tujuan:=Tujuan-Asal. 

Contoh : 

 MOV AX,15 ; AX:=15 

 MOV BX,12 ; BX:=12 

 SUB AX,BX ; AX:=15-12=3 

 SUB AX,AX ; AX=0

Untuk menolkan suatu register bisa kita  kurangkan dengan dirinya sendiri seperti SUB AX,AX. 


Seperti pada operasi penambahan, maka pada operasi pengurangan dengan bilangan yang besar(lebih dari 16 bit), bisa kita  pakai  perintah SUB 

ditambah  dengan SBB(Substract With Carry). Perintah SBB dipakai  dengan syntax: 

SBB Tujuan,Asal


Perintah SBB akan mengurangkan nilai Tujuan dengan Asal dengan cara yang sama seperti perintah SUB, lalu  hasil yang diperoleh  dikurangi lagi dengan 

Carry Flag(Tujuan:=Tujuan-Asal-CF). 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : 

 JMP Proses ; Lompat ke Proses 

 ALo EQU 0EFFFh 

 AHi EQU 122h 

 BLo EQU 0FFFFh 

 Bhi EQU 0FEh 

 HslLo DW ? 

 HslHi DW ? 

Proses : 

 MOV AX,ALo ; AX=EFFFh 

 SUB AX,Blo ; Kurangkan EFFF-FFFF, jadi AX=F000 

 MOV HslLO,AX ; HslLo bernilai F000 

 MOV AX,AHi ; AX=122h 

 SBB AX,BHi ; Kurangkan 122-FE-Carry, AX=0023 

 MOV HslHi,AX ; HslHi bernilai 0023

INT 20h ; Kembali ke DOS 

END TData 


 


program   Mengurangkan angka yang memicu  Borrow

Disini dapat pelajar  lihat begaimana caranya mengartikan   suatu nilai  constanta(nilai yang tidak dapat dirubah) dan variabel dengan : 

 ALo EQU 0EFFFh 

 AHi EQU 122h 

 BLo EQU 0FFFFh 

 Bhi EQU 0FEh 

 HslLo DW ? 

 HslHi DW ?

Perintah EQU dipakai  untuk mendefisisikan suatu yang constan(Tetap),  data yang sudah  didiartikan  dengan perintah EQU tidak dapat dirubah. Dengan

perintah EQU pelajar  mengartikan   bahwa ALo = 0EFFF, AHi=122, BLo=FFFF dan 

BHi=0FE. Untuk menampung hasil dari pengurangan A-B(122EFFF-FEFFF) nantinya,  pelajar  diartikan  suatu tempat untuk menyimpannya dengan nama HslLo dan HslHi.ntanda   '?' dipakai  untuk menyatakan bahwa tempat yang pelajar  pesan sebanyak sebanyak 1 word(DW) tidak diberikan data awal yang akan ada  pada varibel  itu (HslLo dan HslHi). Jadi data yang akan ada  pada HslLo dan HslHi  bisa apa saja dan pelajar  tidak mengetahuinya. Tempat data program  pelajar  lompati

dengan perintah JMP agar  komputer tidak mengeksekusi data program  sebagai  perintah. 

 MOV AX,ALo 

 SUB AX,Blo 

 MOV HslLO,AX


Untuk mengurangkan angka 122EFFF dengan 0FEFFFF pelajar  dapat mengurangkan word rendah dari angka itu  dahulu, yaitu EFFF- FFFF. ini  dipicu  

daya tampung register yang hanya 16 bit. Dapat kita  lihat bahwa pengurangan 

EFFF-FFFF akan memicu  terjadinya peminjaman(Borrow), hasil word  rendah(F000) yang diperoleh  lalu  pelajar  simpan pada variabel HslLo. 


 122 EFFF 

 FE FFFF 

 ---------- - 

 023 F000 


Sampai saat ini pelajar  sudah selesai memperoleh  nilai pada word rendahnya, yang disimpan pada variabel HslLo. 


 MOV AX,AHi 

 SBB AX,BHi 

 MOV HslHi,AX


Langkah selanjutnya yaitu menghitung word tingginya yaitu pengurangan 


122-FE-Carry dengan memakai  perintah SBB maka masalah itu  dengan mudah terpecahkan. Akhirnya pelajar  akan memperoleh  hasil pengurangan dari


122EFFF-0FEFFFF yaitu 23F000 yang tersimpan pada pasangan HslHi:HslLo(0023F000).


Perintah DEC(Decrement) dipakai  khusus untuk pengurangan dengan 1 Perintah DEC hanya memakai  1 byte memory, sedang  perintah SUB dan SBB

memakai  3 byte. Oleh sebab itu bila kita  ingin melakukan operasi pengurangan dengan 1 pakai lah perintah DEC. Syntax pemakaian perintah dec 

ini yaitu: 


DEC Tujuan 

Nilai pada tujuan akan dikurangi 1, seperti perintah Tujuan:=Tujuan-1 ,dalam Turbo Pascal. Tujuan disini dapat berupa suatu register atau  memory. 

Contoh : perintah DEC AL akan mengurangi nilai di register AL dengan 1. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

Proses : 

 MOV AH,02h ; Nilai servis 

 MOV DL,'Z' ; DL=5Ah 

 MOV CX,26 ; Banyaknya pengulangan yang akan 

 ; dilakukan 

 Ulang: 

 INT 21h ; Cetak huruf    !! 

 DEC DL ; Kurang DL dengan 1 

 LOOP Ulang ; Lompat ke Ulang 

 INT 20h 

END Proses 


program  Mencetak huruf    "Z".."A"

program  bila dijalankan akan mencetak huruf    "Z" sampai "A" sebagai berikut : 


 ZYXWVUTSRQPONMLKJIHGFEDCBA 


Untuk perkalian bisa dipakai  perintah MUL dengan syntax: 

MUL Sumber

Sumber disini dapat berupa suatu register 8 bit(Mis:BL,BH,..), register  16 bit(Mis: BX,DX,..) atau suatu varibel. Ada 2 kemungkinan yang akan terjadi 

pada perintah MUL ini sesuai dengan jenis perkalian 8 bit atau 16 bit.   Bila Sumber yaitu  8 bit seperti MUL BH maka komputer akan mengambil  nilai yang ada  pada BH dan nilai pada AL untuk dikalikan. Hasil yang

diperoleh  akan selalu disimpan pada register AX. Bila sumber yaitu  16 bit seperti MUL BX maka komputer akan mengambil nilai yang ada  pada BX dan

nilai pada AX untuk dikalikan. Hasil yang diperoleh  akan disimpan pada register 

DX dan AX(DX:AX), jadi register DX menyimpan Word tingginya dan AX menyimpan Word rendahnya. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : 

 JMP Proses ; Lompat ke Proses 

 A DW 01EFh 

 B DW 02FEh 

 HslLo DW ? 

 HslHi DW ? 

Proses: 

 MOV AX,A ; AX=1EF 

 MUL B ; Kalikan 1FH*2FE 

 MOV HslLo,AX ; AX bernilai C922 sehingga HslLo=C922 

 MOV HslHi,DX ; DX bernilai 0005 sehingga HslHi=0005 

 INT 20h ; Kembali ke DOS 

END TData 


program  . Proses perkalian dengan MUL

Pada program  pelajar  mengartikan   angka untuk variabel 'A'=1EF dan 'B'=2FE dengan DW. sebab  tidak dipakai  EQU, maka varibel 'A' dan 'B' dapat

dirubah bila diinginkan. 


Operasi pada pembagian pada dasarnya sama dengan perkalian. Untuk operasi pembagian dipakai  perintah DIV dengan syntax: 

DIV Sumber


 Bila sumber yaitu  operand 8 bit seperti DIV BH, maka komputer akan mengambil nilai pada register AX dan membaginya dengan nilai BH. Hasil pembagian 8 bit ini akan disimpan pada register AL dan sisa dari pembagian  akan disimpan pada register AH. 

 Bila sumber yaitu  operand 16 bit seperti DIV BX, maka komputer akan  mengambil nilai yang ada  pada register DX:AX dan membaginya dengan nilai 

BX. Hasil pembagian 16 bit ini akan disimpan pada register AX dan sisa dari  pembagian akan disimpan pada register DX. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : 

 JMP Proses ; Lompat ke Proses 

 A DW 01EFh 

 B DW 2 

 Hsl DW ? 

 Sisa DW ? 

Proses: 

 SUB DX,DX ; Jadikan DX=0 

 MOV AX,A ; AX=1EF 

 DIV B ; Bagi 1EF:2 

 MOV Hsl,AX ; AX bernilai 00F7 sehingga Hsl=00F7 

 MOV Sisa,DX ; DX berisi 0001 sehingga Sisa=0001 

 INT 20h ; Kembali ke DOS 

END Tdata 


program  Proses pembagian bilangan 16 bit

Cobalah kita  trace dengan debug untuk melihat hasil yang diperoleh  pada  register AX dan DX.

Pada program -program  sebelumnya(pengurangan,perkalian dan pembagian) dapat kita  lihat bahwa hasil dari operasi aritmatika disimpan dalam 2 variabel

yang mana  1 variabel untuk menampung hasil dari word tingginya dan 1 word untuk menampung word rendahnya. Bukankah ini  akan tampak menjadi aneh, sebab  bila pelajar  ingin melihat nilai itu  maka nilai itu  harus disatukan  barulah dapat dibaca. Apakah ada cara lain agar  hasilnya dapat disimpan pada

satu variabel saja ? YA!!, namun  untuk itu kita  harus memakai  pointer untuk mengaksesnya. Bila kita  tidak memakai  pointer maka tipe data

penampung harus sesuai dengan registernya. Tanpa pointer untuk memindahkan  data dari suatu variabel ke register 8 bit, maka variabel itu  haruslah 8

bit juga yang dapat didiartikan  dengan DB, demikian juga untuk register 16 bit dengan variabel yang didiartikan  dengan DW. Contoh : 

A DB 17 ; DB=8 bit jadi A=8 bit 

B DW 35 ; DW=16 bit jadi B=16 bit 

MOV AL,A ; 8 bit dengan 8 bit 

MOV AX,B ; 16 bit dengan 16 bit.

Seperti pada contoh diatas kita  tidak bisa memakai  perintah MOV AX,A sebab  kedua operand tidak memiliki  daya tampung yang sama(16 dan 8 bit).

Bila kita  melakukan pemindahan data dari operand yang berbeda tipe data 

penampungnya maka akan ditampikan "**Error** BAGI.ASM(20) Operand types do not

match". Dengan memakai  pointer ini  bukanlah masalah. Sebelum itu lihat dahulu berbagai tipe data yang ada  pada assembler. 

Didalam assembler pelajar  bisa menyimpan data dengan berbagai tipe data yang berbeda-beda. pelajar  dapat memberi  nama pada data itu , untuk 

memudahkan dalam pengaksesan data itu . sedang  tipe data yang ada   pada assembler dapat kita  lihat 

------------------------------------------ 

 NAMA UKURAN 

------------------------------------------

DB<Define Byte> 1 BYTE 


DW<Define Word> 2 BYTE 


DD<Define DoubleWord> 4 BYTE 


DF<Define FarWords> 6 BYTE 


DQ<Define QuadWord> 8 BYTE 


DT<Define TenBytes> 10 BYTE 

------------------------------------------- 

 gambar  kode    Berbagai Tipe Data


contoh :  lihatlah bagaimana tipe data ini

dipakai  : 

 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : 

 JMP Proses 

 A DB 4 ; 1 byte, nilai awal='4' 

 B DB 4,4,4,2,? ; 1*5 byte, nilai awal=4,4,4,2,? 

 C DB 4 DUP(5) ; 1*4 byte, nilai awal='5' 

 D DB 'HAI !!' ; 6 byte berisi 6 huruf    

 E DW ? ; 1 word tidak diketahui isinya 

 F DW ?,?,? ; 3 word tidak diketahui isinya 

 G DW 10 DUP(?) ;10 word tidak diketahui isinya 

 H DD ? ; 1 DoubleWord tanpa nilai awal 

 I DF ?,? ; 2 FarWord tanpa nilai awal 

 J DQ 0A12h ; 1 QuadWord, nilai awal='0A12' 

 K DT 25*80 ; 1 TenBytes, nilai awal='2000' 

 L EQU 666 ; Konstanta, L=666 

 M DB '123' ; String '123' 

 N DB '1','2','3' ; String '123' 

 O DB 49,50,51 ; String '123' 

Proses : ; 

END Tdata


Pada baris pertama("A DB 4") pelajar  mengartikan   sebanyak satu bytebuntuk variabel dengan nama "A", variabel ini diberi nilai "4".  Pada baris kedua("B DB 4,4,4,2,?") pelajar  mengartikan   sebanyak 5 byte 

yang berpasangan untuk variabel dengan nama "B". Tiga byte pertama pada  variabel "B" itu  semuanya diberi nilai awal "4", byte ke empat diberi

nilai awal 2 sedang  byte ke lima tidak diberi nilai awal.

Pada baris ketiga("C DB 4 DUP(5)") pelajar  mengartikan   sebanyak 4 byte data yang diberi nilai awal "5" semuanya (DUP=Duplikasi). Jadi dengan perintah  DUP pelajar  dapat mengartikan   suatu Array.

Pada baris keempat("D DB 'HAI !! '") pelajar  mengartikan   suatu string dengan DB. Untuk mengartikan   string selanjutnya akan selalu pelajar  pakai tipe data DB. Bila pelajar  mengartikan   string dengan DW maka hanya 2 huruf    yang

dapat dimasukkan, format penempatan dalam memorypun nantinya akan membalikkan angka itu . 

Pada baris kelima("E DW ?") pelajar  mengartikan   suatu tipe data Word  yang tidak diberi nilai awal. Nilai yang ada  pada variabel "E" ini bisa berupa apa saja, pelajar  tidak perduli.  Pada baris keduabelas("L EQU 666") pelajar  mengartikan   suatu konstanta 

untuk variabel "L", jadi nilai pada "L" ini tidak dapat dirubah isinya. 

Pada variabel M, N, O pelajar  mengartikan   suatu string "123" dalam  bentuk yang berbeda. Ketiganya akan disimpan oleh assembler dalam bentuk yang 

sama, berupa angka 49, 50 dan 51. 

Pada program -program  selanjutnya akan dapat kita  lihat bahwa pelajar  selalu melompati area  data("TData:JMP Proses"), mengapa demikian ? Bila pelajar  tidak  melompati area  data ini maka proses akan melalui area  data ini. Data-data 

program  akan dianggap oleh komputer sebagai suatu intruksi yang akan dijalankan sehingga apapun mungkin bisa terjadi disana. contoh :  akan

pelajar  buat sebuah program  yang tidak melompati area  data, sehingga data akan dieksekusi sebagai intruksi. program  ini sudah  diatur sedemikian rupa untuk membunyikan speaker kita , pada akhir data diberi nilai CD20 yaitu  bahasa mesin dari intruksi INT 20h. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

Tdata:DB 0E4h,61h,24h,0FEh,0E6h,61h,0B9h,0D0h,7h,0BBh,9Ah 

 DB 2h,8Bh,0D1h,51h,34h,2h,0E6h,61h,0D1h,0C3h,73h,6h 

 DB 83h,0C1h,0h,0EBh,0Bh,90h,52h,2Bh,0D1h,87h,0D1h,5Ah 

 DB 81h,0C1h,34h,8h,0E2h,0FEh,59h,0E2h,0E2h,0CDh,20h 

END Tdata 


program    Yang Mengeksekusi area  Data


Sebelum pelajar  melangkah lebih jauh, marilah pelajar  lihat dahulu bagaimana komputer menyimpan suatu nilai didalam memory. Untuk itu ketikkanlah program


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : JMP Proses 

 A DB 12h,34h 

 B DW 0ABCDh 

 C DD 56789018h 

 D DB 40 DUP(1) 

END Tdata 


program   mengartikan   Data

Sesudah  program  diketikkan dan dijadikan COM dengan TASM.EXE dan  TLINK.EXE, pakailah debug untuk melihat bagaimana data itu  disimpan

didalam memory komputer. 


C:\>debug data.com 

A B C D 


-d +-+-+ +-+-+ +----+----+ +----+-------- 

3001:0100 EB 31 90 12 34 CD AB 18-90 78 56 01 01 01 01 01 

3001:0110 01 01 01 01 01 01 01 01-01 01 01 01 01 01 01 01 

3001:0120 01 01 01 01 01 01 01 01-01 01 01 01 01 01 01 01 

3001:0130 01 01 01 E0 AC 91 51 AD-8B C8 25 0F 00 8B D9 B1 

3001:0140 04 D3 EB D1 E3 26 03 1E-64 01 8B 17 06 1F BF 04 

3001:0150 00 57 BF FA 05 E8 83 0A-73 03 E8 63 0A 26 89 15 

3001:0160 B9 FF FF EB 18 8E 06 82-01 2B DB 26 02 1C 7D 09 

3001:0170 46 80 EB 80 8A FB 26 8A-1C 46 E8 16 DA 48 7D E5 

-q 


gambar  kode   . Data program   

Ketiga byte pertama pada gambar  kode    yaitu bahasa mesin dari perintah "JUMP PROSES" dan "NOP". Pada byte ke 4 dan ke 5 ini yaitu data dari variabel

"A", dapat pelajar  lihat bahwa data dari variabel "A"(1234) yang didiartikan  dengan "DB" disimpan didalam memory komputer sesuai dengan yang didiartikan .  Dua byte selanjutnya(byte ke 6 dan 7), yaitu  data dari variabel C yang sudah  pelajar  diartikan  dengan "DW(2 byte)". Ternyata kedua byte dari variabel "C"(ABCD) disimpan didalam memory dalam urutan yang terbalik(CDAB) !. Mengapa begini ?. ini  dipicu  penyimpanan dimemory yang menyimpan  nilai tingginya pada alamat tinggi. kita  dapat lihat pada ke 4 byte  selanjutnya, yaitu data dari variabel "D" juga disimpan dengan susunan yang

terbalik(56789018 menjadi 18907856). 


Kini pelajar  sudah siap untuk melihat bagaimana memindahkan data dari variabel atau  register yang berbeda tipe datanya, dengan memakai  pointer. Untuk itu dipakai  perintah PTR dengan format penulisan :  TipeData PTR operand

agar  lebih jelas, marilah pelajar  lihat pemakaian ya didalam program . 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : 

 JMP Proses ; Lompat ke Proses 

 A DW 01EFh ; 2 Byte 

 B DW 02FEh ; 2 Byte 

 D DD ? ; 4 Byte 

Proses: 

 MOV AL,BYTE PTR A ; AL=EF, AX=?EF 

 MOV AH,BYTE PTR A+1 ; AH=01, AX=01EF 

 MOV BX,B ; BX=02FE 

 MOV WORD PTR D,AX ; D=??01EF 

 MOV WORD PTR D+2,BX ; D=02FE01EF 

 INT 20h ; Kembali ke DOS 

END TData 


program   memakai  Pointer


Pada awalnya pelajar  mengartikan   variabel "A" dan "B" dengan tipe data  word(16 bit) yang memiliki  nilai awal 01EF dan 02FE, dan  variabel "C"  dengan tipe data DoubleWord(32 bit) yang tidak diinialisasi. 

MOV AL,BYTE PTR A 

MOV AH,BYTE PTR A+1

Pada kedua perintah itu , pelajar  memindahkan data dari variabel "A" ke register AX dengan byte per byte.  bahwa pelajar  harus menyesuaikan pemindahan data yang dilakukan dengan kemampuan daya tampungnya. Oleh sebab  itu dipakai  "BYTE" PTR untuk memindahkan data 1 byte menuju register 8 bit, 

sehingga  untuk memindahkan data 16 bit harus dipakai  "WORD" PTR.

Pada baris pertama pelajar  memindahkan byte rendah dari variabel "A" (EF) menuju  register AL, lalu  pada baris kedua pelajar  memindahkan byte tingginya(01)  menuju register AH. Lihatlah pelajar  memakai  "BYTE PTR A" untuk nilai byte

rendah dan "BYTE PTR+1" untuk byte tinggi dari variabel "A" dipicu   penyimpanan data dalam memory komputer yang menyimpan byte tinggi terlebih

dahulu,

MOV BX,B 

MOV WORD PTR D,AX

MOV WORD PTR D+2,BX

Pada bagian ini akan pelajar  coba untuk memindahkan data dari 2 register 16

bit menuju 1 variabel 32 bit. Pada baris pertama "MOV BX,B" tentunya tidak  ada masalah sebab  kedua operand memiliki  daya tampung yang sama. Pada baris  kedua "MOV WORD PTR D,AX" pelajar  memindahkan nilai pada register AX untuk

disimpan pada variabel "D" sebagai word rendahnya. lalu  pada baris ketiga 

"MOV WORD PTR D+2,BX" pelajar  masukkan nilai dari register BX pada variabel "D"

untuk word tingginya sehingga nilainya sekarang yaitu BX:AX=02FE01EF.

lihat  pada baris ketiga pelajar  melompati 2 byte(WORD PTR+2) dari variabel "D" untuk menyimpan word tingginya. 

Kini dengan memakai  pointer ini pelajar  bisa menyimpan hasil perkalian

16 bit didalam 1 varibel 32 bit. Untuk itu lihatlah program  ini 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : 

 JMP Proses ; Lompat ke Proses 

 A DW 01EFh ; 2 Byte 

 B DW 02FEh ; 2 Byte 

 Hsl DD ? ; 4 Byte 

Proses: 

 MOV AX,A ; AX=1EF 

 MUL B ; Kalikan 1FH*2FE 

 MOV WORD PTR Hsl,AX ; AX bernilai C922, Hsl=??C922 

 MOV WORD PTR Hsl+2,DX ; DX bernilai 0005, Hsl=0005C922 

 INT 20h ; Kembali ke DOS 

END TData 

program  Menampung nilai 2 register dalam 1 variabel

MANIPULASI BIT DAN LOGIKA 


Operator NOT akan menginvers suatu nilai seperti yang tampak  pada gambar  kode   ini


+-----+----------+ 


| A | Not (A) | 


+-----+----------+ 


| 0 | 1 | 


| 1 | 0 | 


+-----+----------+ 


gambar  kode  . Tabel Operator NOT

Operasi Not di dalam assembler, dipakai  dengan syntax : 

NOT Tujuan,Sumber

Hasil dari operasi not ini akan disimpan pada Tujuan, sebagai contoh,  instruksi NOT AL,3Fh akan menghasilkan nilai C0h bagi AL. Mungkin masih ada

pembaca yang bingung dengan operasi ini. Baiklah untuk lebih jelasnya pelajar   lihat operasi di atas secara per bit. 

 3 F 

 +--+-++--+-+ 

Bilangan : 0011 1111 

 C 0 

 +--+-++--+-+ 


Not : 1100 0000 


Operator AND akan menghasilkan nilai nol bila salah satu operandnya bernilai nol. Dan hanya akan bernilai satu bila kedua operandnya bernilai satu. 

+-----+-----+----------+ 


| A | B | A AND B | 


+-----+-----+----------+ 

| 0 | 0 | 0 |

| 0 | 1 | 0 | 

| 1 | 0 | 0 | 

| 1 | 1 | 1 | 


+-----+-----+----------+ 


 gambar  kode . Tabel Operator AND

Operasi AND di dalam assembler, dipakai  dengan syntax : 

AND Tujuan,Sumber

Hasil dari operasi AND ini akan disimpan pada Tujuan, sebagai contoh,  instruksi : 

 MOV AL,3Fh 

 MOV BL,1Ah 

 AND AL,BL 

Perintah diatas akan menghasilkan nilai 1A bagi register AL. Ingatlah : Setiap bit yang di AND dengan 0 pasti menghasilkan bit 0 juga, sedang  setiap bit yang di AND dengan 1 akan menghasilkan bit itu sendiri. 


Operator logik OR akan menghasilkan nilai nol bila kedua operannya bernilai nol dan satu bila salah satunya bernilai satu. 

+-----+-----+----------+ 

| A | B | A OR B | 

+-----+-----+----------+ 

| 0 | 0 | 0 | 

| 0 | 1 | 1 | 

| 1 | 0 | 1 | 

| 1 | 1 | 1 | 

+-----+-----+----------+ 

 gambar  kode   Tabel Operator OR


Operasi OR di dalam assembler, dipakai  dengan syntax : 

OR Tujuan,Sumber

Hasil dari operasi OR ini akan disimpan pada Tujuan, sebagai contoh,  instruksi : 

 MOV AL,3Fh 

 MOV BL,1Ah

OR AL,BL 

Hasil operasi OR diatas akan menghasilkan nilai 3F bagi register AL.  Ingatlah : 

Setiap bit yang di OR dengan 0 pasti menghasilkan bit itu sendiri,  sedang  setiap bit yang di OR dengan 1 pasti menghasilkan bit 1. 


Operator XOR akan menghasilkan nol untuk dua nilai yang sama nilainya dan satu untuk yang berbeda. 

+-----+-----+----------+ 

| A | B | A XOR B | 

+-----+-----+----------+ 

| 0 | 0 | 0 | 

| 0 | 1 | 1 | 

| 1 | 0 | 1 | 

| 1 | 1 | 0 | 

+-----+-----+----------+ 

 gambar  kode   Tabel Operator XOR


Operasi XOR di dalam assembler, dipakai  dengan syntax : 

XOR Tujuan,Sumber

Hasil dari operasi XOR ini akan disimpan pada Tujuan, sebagai, contoh  instruksi : 

 MOV AX,0A12h 

 XOR AX,AX 

Hasil operasi XOR diatas pasti akan menghasilkan nilai 0 bagi register

AX. 

: Setiap bilangan yang di XOR dengan bilangan yang sama pasti menghasilkan bilangan 0. 

Perintah Test dipakai  untuk mengetahui nilai pada suatu bit, dengan  syntax : 


TEST Operand1,Operand2 


Perintah test akan mengAND kedua nilai operand, namun  hasil yang  diperoleh  tidak akan berpengaruh pada  nilai kedua operand itu . Sesudah  perintah Test dilakukan  yang akan terpengaruh yaitu Flags,

sehingga perintah ini sering diikuti dengan perintah yang berkaitan  dengan  kondisi flags. sedang  flags yang terpengaruh yaitu CF,OF,PF,ZF,SF dan AF. 


 TEST AX,0Fh 

 JNZ Proses ; Lompat bila  Zerro flag 0

Pada perintah diatas komputer akan menuju ke label Proses bila ada satu  bit atau lebih dari AX yang sama dengan 0Fh. Bila diikuti dengan perintah JC

Proses, maka komputer akan menuju ke label proses bila keempat byte rendah pada AL semuanya 1(?F). 




Operator SHL  ( Shift Left ) akan menggeser geser  operand1 ke kiri sebanyak operand2 secara 

per bit. lalu  bit kosong yang sudah  tergeser di sebelah kanannya akan diberi nilai nol. Operator SHL dipakai  dengan syntax : 

SHL Operand1,Operand2

agar  lebih jelas bisa kita  lihat pada gambar  kode   Operand2 harus dipakai  register CL bila pergeseran yang dilakukan lebih dari satu kali. 

 +---------------------+ 

 <----- | | <------ 0 

 +---------------------+ 

gambar  kode   Operasi SHL


Instruksi : MOV AX,3Fh 

 MOV CL,3 

 SHL AX,CL ; Geser 3 bit ke kiri 

Akan menghasilkan nilai F8h pada register AX. Operasi detilnya dapat dilihat  di bawah ini. 

3Fh : 0011 1111 

SHL 1 : 0111 1110 (=7Eh) 

SHL 2 : 1111 1100 (=FCh) 

SHL 3 : 1111 1000 (=F8h) 


Operator SHR ( Shift Right ) akan menggeser geser  operand1 ke kanan sebanyak operand2 secara

per bit dan menambahkan nilai nol pada bit yang tergeser seperti halnya pada operator SHL. Operator SHR dipakai  dengan syntax :


SHR Operand1,Operand2


agar  lebih jelas kita  bisa lihat pada gambar  kode   Operand2 harus dipakai  register CL bila pergeseran yang dilakukan lebih dari satu kali. 

 +---------------------+ 

 0 -----> | | ------> 

 +---------------------+ 

gambar  kode  Operasi SHR

 Instruksi : MOV AX,3Fh 

 MOV CL,3 

 SHR AX,CL ; Geser 3 bit ke kanan 

Akan menghasilkan nilai 07h pada register AX. Operasi detilnya dapat dilihat  di bawah ini. 

3Fh : 0011 1111 

SHR 1 : 0001 1111 (=1Fh) 

SHR 2 : 0000 1111 (=0Fh) 

SHR 3 : 0000 0111 (=07h)

ADDRESSING MODES 


 bagaimana perintah "MOV" menyalinkan  suatu nilai kepada suatu register atau variabel, pelajar  bisa

menyalinkan  nilai pada suatu register, variabel ataupun lokasi memory dengan berbagai cara. biasanya banyaknya cara yang dapat dipakai  dapat dibagi menjadi 7, seperti pada gambar  kode   

------------------------------------------------------------- 

ADDRESSING MODE FORMAT SEGMENT REGISTER 

------------------------------------------------------------- 

1. Immediate Data Tidak Ada 

2. Register Register Tidak Ada 

3. Direct Displacement DS 

 Label DS 

4. Register Indirect [BX] DS 

 [BP] SS 

 [SI] DS 

 [DI] DS 

5. Base Relative [BX]+Displacement DS 

 [BP]+Displacement SS 

6. Direct Indexed [DI]+Displacement DS 

 [SI]+Displacement DS 

7. Base Indexed [BX][SI]+Displacement DS 

 [BX][DI]+Displacement DS 

 [BP][SI]+Displacement SS 

 [BP][DI]+Displacement SS 

------------------------------------------------------------ 


gambar  kode   Addressing Modes 


 ,bahwa ada juga menyalinkan  data yang terlarang,

yaitu : 


--menyalinkan  data langsung antar memory, seperti: 

 MOV MemB,MemA

 Untuk memecahkan ini , kita  bisa memakai  register general purpose  sebagai perantara, seperti: 

 MOV AX,MemA 

 MOV MemB,AX


-- menyalinkan  data antar register yang berbeda tipenya(8 bit dengan 16 bit)  tanpa memakai  pointer, seperti: 

 MOV AL,BX


-- menyalinkan  data antar segment register, seperti: 

 MOV DS,ES

 Untuk memecahkan ini , kita  bisa memakai  register general purpose sebagai perantara, seperti: 

 MOV AX,ES 

 MOV DS,AX

Selain dengan cara diatas, kita  bisa juga memakai  stack sebagai  perantara, seperti: 

 PUSH ES 

 POP DS 


--Pemberian nilai untuk segment register(DS, ES, CS, SS) secara langsung, seperti: 

 MOV ES,0B800h

Untuk memecahkan ini , kita  bisa memakai  register general purpose  sebagai perantara, seperti: 

 MOV AX,0B800h 

 MOV ES,AX


sebab  addressing modes yaitu  dasar bagi

program mer bahasa assembly yang harus dikuasai. 

menyalinkan  data yang tercepat yaitu  yang dinamakan dengan Immediate Addressing dan Register Addressing. Immediate Addressing yaitu suatu  menyalinkan  data untuk suatu register 8,16 atau 32(80386) bit langsung dari suatu angka. Contohnya : 

MOV AX,50h 

MOV EAX,11223344h <80386> 

Immediate Addressing dapat juga memperoleh  nilainya melalui suatu constanta yang sudah  didiartikan  dengan perintah EQU, seperti :

A EQU 67h   ;   ; 

 MOV AX,A

Perintah diatas akan menyalinkan  nilai 67h untuk register AX. 

Register Addressing yaitu suatu proses menyalinkan  data antar register. menyalinkan  antar register ini harus dipakai  register yang berukuran sama, 

seperti AL dan BH, CX dan AX. Contah perintahnya: 

MOV AX,CX

Register Addressing dapat juga dapat juga hanya terdiri atas sebuah  register seperti pada perintah INC CX. 


 .MODEL SMALL 

 .386 ; Untuk prosesor 80386 

 .CODE 

 ORG 100h 

Proses : 

 MOV EAX,12345678h ; Immediate Addressing 

 MOV EDX,33112244h ; Immediate Addressing 

 MOV EBX,EDX ; Register Addressing 

 MUL EBX ; Register Addressing 

END Proses 


program  Perkalian pada 80386

Aturan perkalian pada pada 80386 ini sama dengan perkalian yang sudah pelajar  bicarakan didepan. Pada prosesor 80386 dipakai  register-register 32

bit, seperti EAX ,EBX dan EDX pada contoh program  Untuk memakai  kelebihan pada komputer 80386 ini pelajar  harus menambahkan directive .386. 


biasanya Direct Addressing yaitu  suatu menyalinkan  data pada suatu register dan simbol.  Contoh:

TData : JMP Proses 

 A DB 12h 

 B DB 59h 

Proses : MOV AL,A ; Direct Addressing 

 MOV AH,B ; Direct Addressing

Perintah diatas akan menyalinkan  data variabel A dan B pada register AL  dan AH. 


Register Indirect Addressing biasanya dipakai  untuk mengakses suatu data yang banyak dengan mengambil alamat efektive dari data itu . Register-register yang bisa dipakai  pada addressing ini yaitu BX,BP,SI dan DI. namun  bila kita  memrogram pada prosesor 80386(Dengan menambahkan

directive .386) maka semua register general purpose bisa dipakai.  Untuk memperoleh  alamat efektive dari suatu data bisa dipakai  perintah LEA(Load Effective Addres) dengan syntax : 


LEA Reg,Data


Untuk mengakses data yang ditunjukkan oleh register Reg, sesudah  diperoleh nya alamat efektive harus dipakai  tanda   kurung siku ('[  ]').  bila  pada perintah pengaksesannya tidak dinamakan kan segmennya, maka yang dipakai  yaitu segment default. Seperti bila dipakai  register BX sebagai penunjuk offset, maka segment DS yang dipakai . Sebalikkan bila dipakai 

register BP sebagai penunjuk offset, maka segment SS yang dipakai . 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : JMP Proses 

 Kal DB 'ABCDEF' 

Proses: 

 LEA BX,Kal ; Ambil Offset Kal 

 MOV CX,2 

 Ulang: 

 MOV DL,[BX] ; kode ASCII yang ingin dicetak 

 MOV AH,02h ; Nilai servis ntuk mencetak huruf    

INT 21h ; lakukan  !! 

 ADD BX,2 ; BX:=BX+2 

 LOOP Ulang ; Lompat ke Ulang 

 INT 20h 

END TData 


program  Proses Register Indirect Addressing

Bila program   dijalankan maka dilayar kita  akan tercetak :  AC

Pertama-tama pelajar  mengartikan   data untuk variabel 'Kal', yang mana  data ini nantinya akan disimpan pada memory, seperti berikut : 

 +-----+-----+-----+-----+-----+-----+ 

 | A | B | C | D | E | F | 

 +-----+-----+-----+-----+-----+-----+ 

Alamat Offset: 103 104 105 106 107 108

 Pada perintah LEA BX,Kal, maka register BX akan menunjuk pada alamat efektive dari variabel Kal, sebagai berikut :   BX=103 

 _

 +-----+-----+-----+-----+-----+-----+ 

 | A | B | C | D | E | F | 

 +-----+-----+-----+-----+-----+-----+ 

Alamat Offset: 103 104 105 106 107 108 


 Pada perintah MOV CX,2, pelajar  memberi  nilai 2 kepada register CX untuk dipakai  sebagai counter pada saat LOOP. Kini lihat  bahwa pelajar  

mengambil nilai yang ditunjukkan oleh register BX yaitu 'A' dengan perintah

MOV DL,[BX]. tanda   kurung siku menyatakan bahwa pelajar  bukannya mengambil nilai  BX namun  nilai yang ditunjukkan oleh register BX. Sesudah  itu pelajar  mencetak huruf    itu  dengan interupsi 21h servis 02 yang mana  kode ASCII dari  huruf    yang ingin dicetak sudah  pelajar  masukkan pada register DL. 

 Pada perintah ADD BX,2 pelajar  menambahka nilai 2 pada BX sehingga kini BX akan berjalan sebanyak 2 byte dan menunjuk pada data 'C' sebagai berikut : 

 BX=105 

 _ 

 +-----+-----+-----+-----+-----+-----+

| A | B | C | D | E | F | 

 +-----+-----+-----+-----+-----+-----+ 

Alamat Offset: 103 104 105 106 107 108

Kini BX sudah  menunjuk pada alamat tempat data 'C' berada, sehingga pada pencetakan huruf    selanjutnya, yang tercetak yaitu huruf    'C'. 

Ingatlah:  satu huruf    memakai  satu byte memory. 

Jenis addressing ini biasanya dipakai  untuk mengakses suatu tabel dengan mengambil alamat efektivenya. Alamat efektive dari tabel itu 

nantinya dipakai  sebagai patokan untuk mengakses data yang lain pada tabel itu . Register yang dipakai  sebagai penunjuk alamat efektive ini yaitu

register BX,BP,SI dan DI. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : JMP Proses 

 Tabel DW 11h,50h,0Ah,14h,5Ah 

Proses: 

 LEA BX,Tabel 

 MOV AX,Tabel 

 ADD AX,[BX]+2 

 ADD AX,[BX]+4 

 ADD AX,[BX+6] 

 ADD AX,[BX+8] 

 INT 20h 

END TData 


program   Proses Base Relative Addressing


Pertama-tama pelajar  mengartikan   suatu tabel yang berisi data     11h,50h,0Ah,14h dan 5Ah. Data ini akan disimpan dalam memory sebagai berikut : 

 +------+------+------+------+------+ 

 | 0011 | 0050 | 000A | 0014 | 005A | 

 +------+------+------+------+------+ 

Alamat Offset: 103 105 107 109 10A 

Sesudah  itu pelajar  mengambil alamat efektifnya dengan memakai  register BX dengan perintah LEA BX,Tabel sehingga BX akan menunjuk pada alamat data

yang pertama.   BX=103  _ 

 +------+------+------+------+------+ 

 | 0011 | 0050 | 000A | 0014 | 005A | 

 +------+------+------+------+------+ 

Alamat Offset: 103 105 107 109 10A 

 Dengan perintah MOV AX,Tabel maka AX akan berisi nilai pada word pertama variabel 'Tabel', yaitu 11. Dengan BX yang sudah  menunjuk pada data 

pertama(11) maka pelajar  bisa memakai nya sebagai patokan untuk mengakses data yang lain. 


 BX BX+2 BX+4 BX+6 BX+8 

 _ _ _ _ _ 

 +------+------+------+------+------+ 

 | 0011 | 0050 | 000A | 0014 | 005A | 

 +------+------+------+------+------+ 

Alamat Offset: 103 105 107 109 10A 

 ,bahwa pelajar  mengakses data yang lain pada  BX 

tanpa merubah posisi dari penunjuk BX, jadi BX tetap menunjuk pada offset

Tabel. pelajar  menambah BX dengan 2 sebab  data terdefinisi sebagai word(2 byte). 

Pada contoh program  dapat kita  lihat bahwa menambah BX didalam dan diluar kurung siku yaitu sama. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : JMP Proses 

 Kalimat DB 'NYAMUK GORENG' ; 13 huruf    

Proses: 

 XOR BX,BX ; BX=0 Untuk penunjuk Offset 

 MOV CX,13 ; Counter LOOP 

Ulang : 

 MOV DL,Kalimat[BX] ; Ambil huruf    yang ke BX 

 MOV AH,02 ; Servis untuk cetak huruf    

 INT 21h ; Cetak huruf    

 INC BX ; BX:=BX+1 

 LOOP Ulang ; Lompat ke Ulang sampai CX=0 

INT 20h ; Selesai, kembali ke DOS !! 

END TData 


program  Mencetak kalimat dengan Base Relative AddressingBila program  dijalankan maka dilayar akan tampak tulisan : 


 NYAMUK GORENG


Pada program   ini register BX dijadikan sebagai pencatat offset dari "kalimat". Dengan nilai BX sama dengan nol(0), akan menunjuk pada  huruf    pertama dari Kalimat(ingat! XOR dengan bilangan yang sama pasti menghasilkan 0). Sesudah  itu pelajar  memberi  nilai 13 kepada CX sebagai penghitung banyaknya LOOP yang akan terjadi. 

 Kalimat[0] Kalimat[12] 

 _ _ 

 +-+-+-+-+-+-+-+-+-+-+-+-+-+ 

 |N|Y|A|M|U|K| |G|O|R|E|N|G| 

 +-+-+-+-+-+-+-+-+-+-+-+-+-+


 Pada perintah MOV DL,Kalimat[BX], register BX dipakai  untuk  menandakan  offset dari kalimat. sehingga  saat pertama kali yang  dimasukkan pada register DL untuk dicetak yaitu huruf    'N' lalu  BX

ditambah satu sehingga BX menunjuk pada huruf    'Y'. Demikian seterusnya sampai seluruh kalimat itu  tercetak. 


Direct Indexed Addressing mengambil alamat efektive dari suatu data dan mengakses data dengan memakai  register DI atau SI. contoh :  akan 

pelajar  lihat tanggal dikeluarkannya ROM BIOS komputer.  Tanggal dikeluarkannya ROM BIOS pada setiap komputer ada  pada  alamat mulai F000h:FFF5h sampai F000h:FFFCh. Pada area  ini akan ada  8 byte (8 huruf) yang berisi tanggal dikeluarkannya ROM BIOS. Tanggal yang  tercantum memakai  format penulisan tanggal Amerika, contoh  04/03/73

artinya 14 Maret 1973. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

Proses : 

 MOV AX,0F000h ; Masukkan nilai F000 pada AX 

 MOV ES,AX ; Copykan nilai AX ke ES 

 MOV BX,0FFF5h ; Penunjuk Offset 

 XOR SI,SI ; Jadikan SI=0 

 MOV CX,8 ; Counter untuk LOOP 

 Ulang: 

 MOV DL,ES:[BX][SI] ; Ambil isi alamat ES:BX+SI 

 MOV AH,02h ; Nilai servis mencetak huruf    

 INT 21h ; Cetak !! 

 INC SI ; SI:=SI+1 

 LOOP Ulang ; Lompat ke Ulang sampai CX=0 

 INT 20h ; Selesai ! kembali ke DOS 

END Proses 


program   Melihat Versi ROM BIOS

Bila program   dijalankan, maka akan ditampilkan : 

18/08/94 <pada komputer kita  mungkin lain> 

pelajar  tidak bisa langsung mengisikan sebuah nilai kepada segment register, oleh sebab  itu dipakai  register AX sebagai perantara sebagai  berikut: 


MOV AX,0F000h 

 MOV ES,AX


Sesudah  itu register BX yang pelajar  pakai  sebagai penunjuk offset, diisi  dengan nilai FFF5, sedang  SI yang nantinya dipakai  sebagai displacement(perpindahan) pelajar  jadikan nol. Register CX yang dipakai  sebagai  counter diisi dengan 8, sesuai dengan jumlah LOOP yang dinginkan: 

MOV BX,0FFF5h 

XOR SI,SI 

MOV CX,8 


Kini pelajar  bisa mengambil data pada alamat F000:FFF5, dengan segmnent register ES dan offset pada register BX+SI. Segment register ES ini harus

dituliskan, sebab  bila tidak dituliskan maka segment yang dipakai  yaitu  segment default atau segment register DS. Register SI dipakai  sebagai 

perpindahan pada  register BX, [BX][SI] artinya register BX+SI. 

MOV DL,ES:[BX][SI] 

MOV AH,02h 

INT 21h 

INC SI 

 LOOP Ulang 

Proses diulangi sampai 8 huruf    tanggal dikeluarkannya ROM BIOS

tercetak semua. 


 Based Indexed Addressing ,Jenis addressing ini biasanya dipakai  untuk mengakses suatu record

atau suatu array 2 dimensi. 


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : JMP Proses 

 Mahasiswa STRUC 

 Nim DW 0 ; 2 byte 

 Tinggi DB 0 ; 1 byte 

 Nilai DB 0,0,0,0 ; 4 byte 

 Mahasiswa ENDS 

 Absen Mahasiswa 10 DUP (<>) 

Proses: 

 LEA BX,Absen ; BX Menunjuk Offset Absen 

 ADD BX,21 ; BX Menunjuk pada Record ke 4 

 XOR SI,SI ; SI=0 

 MOV [BX][SI].Nim ,0099h ; NIM, record ke 4 

 MOV [BX][SI].Tinggi ,10h ; Tinggi, record ke 4 

 MOV [BX][SI+1].Nilai,78h ; Nilai pertama 

 MOV [BX][SI+2].Nilai,99h ; Nilai kedua 

 MOV [BX][SI+3].Nilai,50h ; Nilai keempat 

 MOV [BX][SI+4].Nilai,83h ; Nilai kelima 

 INT 20h ; Selesai !! 

END TData 


program  Teknik Mengakses Record

Pada program  akan pelajar  lihat bagaimana based indexed addressding memudahkan pelajar  dalam mengakses suatu array record. 

Mahasiswa STRUC 


 Nim DW ? 

 Tinggi DB ? 

 Nilai DB ?,?,?,? 

Mahasiswa ENDS 

Absen Mahasiswa 10 DUP (<>)


Perintah "STRUC" dipakai  untuk mengartikan   suatu record dan diakhiri dengan "ENDS". Field-field yang pelajar  diartikan  untuk record mahasiswa ini yaitu 2 byte untuk NIM, 1 byte untuk Tinggi, 4 byte untuk

Nilai. Jadi besar satu record yaitu 7 byte. Pada baris selanjutnya pelajar   mengartikan   10 buah record mahasiwa dengan perintah DUP. tanda   cryptic

"(<>)" dipakai  untuk menginialisasi nilai pada array menjadi nol. 


ADD BX,21 

XOR SI,SI

Pada contoh program  ini pelajar  akan memasukan data pada record ke 4, dan sebab  1 record memakai  7 byte, maka BX pelajar  tambah dengan 21 agar  BX 

menunjuk pada record ke 4. Register SI yang nantinya pelajar  pakai  sebagai  perpindahan dijadikan 0. 

MOV [BX][SI].Nim ,0099h 

MOV [BX][SI].Tinggi ,10h 

Dengan BX yang sudah  menunjuk pada record ke 4, maka pelajar  bisa langsung memasukkan nilai untuk NIM dan Tinggi pada record ke 4. 

MOV [BX][SI].Nilai ,78h 

MOV [BX][SI+1].Nilai,99h 

MOV [BX][SI+2].Nilai,50h 

MOV [BX][SI+3].Nilai,83h


Kini lihat  bahwa dalam memasukkan angka untuk variabel "nilai"  yang memiliki  4 byte bisa pelajar  pakai  register SI sebagai perpindahan. "MOV 

[BX][SI]" akan menunjuk pada byte pertama untuk variabel nilai sedang  "[BX][SI+1]" akan menunjuk pada byte kedua untuk variabel nilai, demikianlah

seterusnya. Mudah Bukan ?.


Untuk mencetak kalimat, bisa dipakai  interupsi 21 fungsi 9 dengan  aturan: 


 INPUT 

AH = 9 

DS:DX = Alamat String itu  

CATATAN = huruf    '$' dijadikan tanda   akhir tulisan 



 .MODEL SMALL 

 .CODE 

 ORG 100h 

Tdata : JMP Proses 

 Kal0 DB 'PROSES PENCETAKAN STRING ',13,10,'$' 

 Kal1 DB 'DIBELAKANG tanda   $ TIDAK BISA DICETAK '

Proses: 

 MOV AH,09h ; Servis ke 9 

 MOV DX,OFFSET Kal0 ; Ambil Alamat Offset Kal0 

 INT 21h ; Cetak perhuruf    sampai tanda   $ 

 LEA DX,Kal0 ; Ambil Alamat Offset Kal0 

 INT 21h ; Cetak perhuruf    sampai tanda   $ 

 LEA DX,Kal0+7 ; Ambil Alamat Offset KAl0+7 

 INT 21h ; Cetak perhuruf    sampai tanda   $ 

 LEA DX,KAL1 ; Ambil Offset kal1 

 INT 21h ; Cetak perhuruf    sampai ketemu $ 

 INT 20h ; Selesai, kembali ke DOS 

END Tdata 


program   Mencetak kalimat dengan fungsi DOS

Pada saat program   kita  jalankan, maka dilayar akan ditampilkan:  Pada saat pendefinisian untuk variabel "KAL0" pelajar  menambahkan tanda   13

dan 10. Kedua tanda   ini yaitu  huruf    kontrol untuk pindah baris(tanda  10) dan menuju kolom 0(tanda   13). Pada akhir dari setiap kalimat yang ingin

dicetak harus pelajar  tambahkan dengan huruf    "$". huruf    ini akan dipakai sebagai tanda   akhir dari kalimat. sebab  huruf    "$" dijadikan sebagai tanda   akhir dari kalimat yang  ingin dicetak, maka pada proses pencetakan huruf    yang kedua hanya kalimat 

"dibelakang tanda  " yang tercetak. sisa kalimatnya, yaitu "tidak bisa dicetak"  tidak tercetak keluar, sebab  terletak dibelakang tanda   "$".  sehingga , bila pelajar  ingin mencetak kalimat yang mengandung tanda  

"$", harus dipakai  fungsi yang lain, contoh  mencetak kalimat dengan  perhuruf    melalui interupsi 21 fungsi 2. 

Pada program   pelajar  sudah  memakai  2 buah huruf    kontrol, yaitu 10(LF) dan 13(CR). huruf    kontrol yang tersedia untuk operasi pada video  yang sering dipakai  ada  5, yaitu 07, 08, 09, 10 dan 13


---------------------------------------------------------------- 

 CODE NAMA FUNGSI 

---------------------------------------------------------------- 


 07 Bel memberi  suara BEEP 

 08 Backspace(BS) Memindahkan kursor 1 kolom ke belakang 

 09 Horisontal Tab Memindahkan kursor 8 kolom ke kanan 

 10 Line Feed(LF) Memindahkan kursor 1 baris ke bawah 

 13 Carriage Return(CR) Memindahkan kursor menuju awal baris 

---------------------------------------------------------------- 

gambar  kode    huruf    Kontrol Yang Sering dipakai 

Selain dari huruf    kontrol pada gambar  kode  masih ada  huruf   ￾huruf    kontrol lain, yang sebagian besar dipakai  untuk keperluan komunikasi komputer dengan periferalnya. huruf    kontrol yang tersedia pada  ASCII secara lengkap bisa kita  lihat pada gambar  kode   ini

-----------------------------+---------------------------------- 

 CODE NAMA | CODE NAMA 

-----------------------------+---------------------------------- 

 00 Nul | 16 Data Link Escape 

 01 Start Of Heading | 17 Device Control 

 02 Start Of Text | 18 Negative Acknowledge 

 03 End Of Text | 19 Synchronous Idle 

 04 End Of Transmission | 20 End Of Transmission Block 

 05 Enquiry | 21 Cancel

 06 Acknowledge | 22 End Of Medium 

 07 Bel | 23 Substitute 

 08 Backspace | 24 Escape 

 09 Horisontal Tabulation| 25 File Separator 

 10 Line Feed | 26 Group Separator 

 11 Vertical Tabulation | 27 Record Separator 

 12 Form Feed | 28 Unit Separator 

 13 Carriage Return | 29 Space 

 14 Shift Out | 30 Delete 

 15 Shift In | 

-----------------------------+---------------------------------- 

gambar  kode   huruf    Kontrol Pada ASCII 



Pada bagian sebelumnya pelajar  mencetak kalimat dengan fungsi DOS yang  mencetak kalimat tanpa atribut. Untuk mencetak kalimat dengan atributnya bisa dipakai  fungsi dari BIOS, melalui interupsi 10h. sedang  yang harus kita  persiapkan yaitu: register AX diisi dengan 1300h, BL diisi dengan atribut yang ingin ditampilkan, BH diisi dengan halaman tampilan, DL diisi dengan posisi X tempat kalimat itu  akan tercetak sedang  DH diisi dengan  posisi Y-nya. sebab  fungsi ini tidak mengenal batas tulisan "$" seperti 

interupsi 21h servis 9, maka pelajar  harus mengisikan CX dengan banyaknya huruf    dalam kalimat. Register ES:BP dipakai  untuk mencatat alamat dari 

kalimat yang ingin dicetak. 

;-----------------------------------------------; 

; INT 10h ; 

;-----------------------------------------------; 

; Input : ; 

; AX = 1300h ; 

; BL = Atribut ; 

; BH = Halaman tampilan ; 

; DL = Posisi X ; 

; DH = Posisi Y ; 

; CX = Panjang kalimat<dalam huruf   >; 

; ES:BP = Alamat awal string ; ; ; ;


 .MODEL SMALL 

 .CODE 

 ORG 100h 

TData : JMP Proses

Kal0 DB ' Menulis kalimat dengan Atributnya ' 

Proses: 

 MOV AX,1300h ; Servis 13h subfungsi 00 

 MOV BL,10010101b ; Atribut tulisan 

 MOV BH,00 ; Halaman tampilan 0 

 MOV DL,20 ; Posisi X 

 MOV DH,12 ; Posisi Y 

 MOV CX,35 ; Banyaknya huruf    dalam string 

 LEA BP,Kal0 ; ES:BP alamat string 

 INT 10h ; Cetak kalimat ! 

 INT 20h ; Selesai, kembali ke DOS 

END TData 


program   Mencetak Kalimat Dengan Atributnya

Bila program  dijalankan, maka layar pada posisi kolom ke 20 dan  baris ke 12 akan ada  tulisan: 

 Menulis kalimat dengan Atributnya  Tulisan ditampilkan dengan warna tulisan putih dan warna dasar jingga..Mengenai halaman layar akan dibahas pada bagian yang lain, sedang  mengenai 

atribut akan segera pelajar  bahas.  Atribut atau warna memakai  1 byte memory, yang akan mengartikan  warna tulisan dan warna dasar dari huruf    yang akan tercetak. Byte atribut ini dipakai  dengan masing-masing bitnya, yang mana  setiap bit mencatat warnanya  masing-masing. sedang  spesifikasinya yaitu: 

 Warna Dasar Warna Tulisan 

 +----+----+ +----+----+ 

Bit-ke 7 6 5 4 3 2 1 0 

 _ _ _ _ _ _ _ _ 

 BL R G B I R G B 

Catatan: BL = Blink atau berkedip 

 R = Merah 

 G = Hijau 

 B = Biru 

 I = Intensitas warna 

Untuk menghidupkan warna yang diinginkan kita  tinggal menjadikan bit  itu  menjadi satu. contoh :  bila kita  menginginkan warna tulisan Biru dengan warna dasar Hijau, maka kita  tinggal menghidupkan bit ke 0 dan 5 atau dengan angka 00100001b(21h). Untuk menjadikannya berintensitas tinggi dan 

berkedip kita  juga tinggal menjadikan bit ke 3 dan 7 menjadi satu(10101001b). 

Bila kita  menghidupkan bit ke 0,1 dan 2 menjadi satu dan mematikan bit￾bit lainnya maka kita  akan memperoleh  campuran dari ketiga warna itu (Putih) untuk warna tulisan dan warna hitam untuk warna dasar. Inilah warna normal yang biasa dipakai , yaitu warna dengan atribut 7


Perintah JMP(Jump), sudah pernah pelajar  pakai , yang mana  perintah ini dipakai  untuk melompati area  data program . Perintah JMP dipakai  dengan

syntax: 

JMP Tujuan

Perintah JMP ini dikategorikan sebagai Unconditional Jump, sebab  perintah ini tidak menyeleksi keadaan apapun untuk melakukan suatu lompatan. 

Setiap ditemui perintah ini maka lompatan pasti dilakukan.  Selain dari perintah jump tanpa syarat, masih banyak perintah Jump yang menyeleksi suatu keadaan tertentu sebelum dilakukan lompatan. Perintah jump dengan penyeleksian kondisi terlebih dahulu biasanya diikuti dengan perintah untuk melihat kondisi, seperti membandingkan dengan perintah "CMP"(Compare). 


Perintah CMP(Compare) dipakai  untuk membandingkan 2 buah operand, dengan syntax: 


CMP Operand1,Operand2

CMP akan membandingkan operand1 dengan operand2 dengan cara mengurangkan operand1 dengan operand2. CMP tidak mempengaruhi nilai Operand1 dan Operand2, perintah CMP hanya akan mempengaruhi flags register sebagai hasil 

perbandingan. sedang  flag-flag yang terpengaruh oleh perintah CMP ini yaitu: 

- OF akan 1, bila  operand1 lebih kecil dari operand2 pada operasi 

 bilangan bertanda  . 

- SF akan 1, bila operand1 lebih kecil dari operand2, pada operasi 

bilangan bertanda  . 

- ZF akan 1, bila  operand1 nilainya sama dengan operand2. 

- CF akan 1, bila  operand1 lebih kecil dari operand2 pada operasi 

bilangan tidak bertanda  . 

Perlu kita  ingat bahwa CMP tidak dapat membandingkan antar 2 lokasi memory. 


Perintah CMP yang hanya mempengaruhi flag register, biasanya diikuti  dengan perintah lompat yang melihat keadaan pada flags register ini. Jenis  perintah lompat yang biasanya mengikuti perintah CMP, ada  12 buah seperti  pada gambar  kode  ini 

-----------------------------+---------------------------------- 

 Perintah Lompat | Kondisi 

-----------------------------+---------------------------------- 

JA <Jump If Above> | Lompat, bila  Operand1 > Operand2 

 | untuk bilangan tidak bertanda   

JG <Jump If Greater> | Lompat, bila  Operand1 > Operand2

| untuk bilangan bertanda   

JE <Jump If Equal> | Lompat, bila  Operand1 = Operand2 

JNE <Jump If Not Equal> | Lompat, bila  Operand1 tidak sama 

 | dengan Operand2 

JB <Jump If Below> | Lompat, bila  Operand1 < Operand2 

 | untuk bilangan tidak bertanda   

JL <Jump If Less> | Lompat, bila  Operand1 < Operand2 

 | untuk bilangan bertanda   

JBE <Jump If Below or Equal>| Lompat, bila  operand1 <= Operand2 

 | untuk bilangan tidak bertanda   

JLE <Jump If Less or Equal> | Lompat, bila  Operand1 <= Operand2 

 | untuk bilangan bertanda   

JAE <Jump If Above or Equal>| Lompat, bila  Operand1 >= Operand2 

 | untuk bilangan tidak bertanda   

JGE <Jump If Greater or | Lompat, bila  Operand1 >= Operand2 

 Equal> | untuk bilangan bertanda   

-----------------------------+---------------------------------- 

gambar  kode  . Perintah Jump yang mengikuti CMP

Pada tabel  dapat kita  lihat bahwa ada  dua operasi yang  berbeda, yaitu operasi bilangan bertanda   dan tidak bertanda  . Bilangan bertanda  nyaitu bilangan yang akan membedakan bilangan negatif dan positif(Mis. 37 dan  -37). sedang  bilangan tidak bertanda   yaitu bilangan yang tidak akan 

membedakan positif dan negatif, jadi angka -1 untuk operasi bilangan bertanda   akan dianggap FFh pada bilangan tidak bertanda  . Lebih jauh mengenai bilangan  bertanda   dan tidak ini bisa kita  lihat pada bab1. 


 .MODEL SMALL 


 .CODE 


 ORG 100h 


TData: JMP Proses 


 BilA DB 67 


 BilB DB 66 


 Kal0 DB 'Bilangan A lebih kecil dari bilangan B $' 


 Kal1 DB 'Bilangan A sama dengan bilangan B $' 


 Kal2 DB 'Bilangan A lebih besar dari bilangan B $' 


Proses: 


 MOV AL,BilA ; Masukkan bilangan A pada AL 


 CMP AL,BilB ; Bandingkan AL(BilA) dengan Bilangan B 


 JB AKecil ; bila  BilA < BilB, lompat ke AKecil 


 JE Sama ; bila  BilA = BilB, lompat ke Sama 


 JA ABesar ; bila  BilA > BilB, lompat ke ABesar

Akecil:


LEA DX,Kal0 ; Ambil offset Kal0 


 JMP Cetak ; Lompat ke cetak 


 Sama: 


 LEA DX,Kal1 ; Ambil offset Kal1 


 JMP Cetak ; Lompat ke cetak 


ABesar: 


 LEA DX,Kal2 ; Ambil offset Kal2 


 Cetak: 


 MOV AH,09 ; Servis untuk mencetak kalimat 


 INT 21h ; Cetak kalimat !! 


 EXIT: INT 20h ; Kembali ke DOS. 


END TData 


program  13.1. memakai  Perintah Lompat Bersyarat


Bila program  13.1. dijalankan, maka akan tampak pada layar: 


Bilangan A lebih besar dari bilangan B


kita  bisa mengganti nilai pada variabel BilA dan BilB untuk melihat hasil yang


akan ditampilkan pada layar. 


13.4. LOMPAT BERSYARAT


Pada gambar  kode   13.1. kita  sudah  melihat sebagian dari perintah lompat


bersyarat. Kini akan pelajar  lihat lompat bersyarat lainnya yang tersedia, 


seperti pada gambar  kode   13.2. Tidak seperti lompat tanpa syarat, Lompat bersyarat 


hanya dapat melompat menuju label yang berjarak -128 sampai +127 byte dari


tempat lompatan. 


-----------------------------+---------------------------------- 


 Perintah Lompat | Kondisi 


-----------------------------+---------------------------------- 


JA <Jump If Above> | Lompat, bila  Operand1 > Operand2 


 | untuk bilangan tidak bertanda   


JG <Jump If Greater> | Lompat, bila  Operand1 > Operand2 


 | untuk bilangan bertanda   


JE <Jump If Equal> | Lompat, bila  Operand1 = Operand2 


JNE <Jump If Not Equal> | Lompat, bila  Operand1 tidak sama 


 | dengan Operand2 


JB <Jump If Below> | Lompat, bila  Operand1 < Operand2 


 | untuk bilangan tidak bertanda   


JL <Jump If Less> | Lompat, bila  Operand1 < Operand2 


 | untuk bilangan bertanda   


JBE <Jump If Below or Equal>| Lompat, bila  operand1 <= Operand2 


 | untuk bilangan tidak bertanda   


JLE <Jump If Less or Equal> | Lompat, bila  Operand1 <= Operand2 


 | untuk bilangan bertanda   


JAE <Jump If Above or Equal>| Lompat, bila  Operand1 >= Operand2 


 | untuk bilangan tidak bertanda   


JGE <Jump If Greater or | Lompat, bila  Operand1 >= Operand2 


 Equal> | untuk bilangan bertanda   


JC <Jump Carry> | Lompat, bila  Carry flag=1


(71)


JCXZ <Jump If CX is Zero> | Lompat, bila  CX=0 


JNA <Jump If Not Above> | Lompat, bila  Operand1 < Operand2 


 | dengan CF=1 atau ZF=1 


JNAE <Jump If Not Above nor | Lompat, bila  Operand1 < Operand2 


 Equal> | dengan CX=1 


JNB <Jump If Not Below> | Lompat, bila  Operand1 > Operand2 


 | dengan CF=0 


JNBE <Jump If Not Below nor | Lompat, bila  Operand1 > Operand2 


 Equal> | dengan CF=0 dan ZF=0 


JNC <Jump If No Carry> | Lompat, bila  CF=0 


JNG <Jump If Not Greater> | Lompat, bila  Operand1 <= Operand2 


 | dengan ZF=1 atau SF tidak sama OF 


JNGE <Jump If Not Greater | Lompat, bila  Operand1 <= Operand2 


 Nor Equal> | dengan SF tidak sama OF 


JNL <Jump If Not Less> | Lompat, bila  Operand1 >= Operand2 


 | dengan SF=OF 


JNLE <Jump If Not Less | Lompat, bila  Operand1 > Operand2 


 Nor Equal> | dengan ZF=0 dan SF=OF 


JNO <Jump If No Overflow> | Lompat, bila  tidak terjadi 


 | tidak terjadi Overflow 


JNP <Jump If Not Parity> | Lompat, bila  Ganjil 


JNS <Jump If No Sign> | Lompat, bila  SF=0 


JNZ <Jump If Not Zero> | Lompat, bila  tidak 0 


JO <Jump On Overflow> | Lompat, bila  OF=1 


JP <Jump On Parity> | Lompat, bila  Genap 


JPE <Jump If Parity Even> | Lompat, bila  PF=1 


JPO <Jump If Parity Odd> | Lompat, bila  PF=0 


JS <Jump On Sign> | Lompat, bila  SF=1 


JZ <Jump Is zero> | Lompat, bila  0 


-----------------------------+---------------------------------- 

gambar  kode    Daftar Perintah Jump 


Bila dilihat pada daftar , perintah untuk lompat sebetulnya  sangat mudah untuk dipakai  sebab  setiap huruf melambangkan suatu kata. Dengan 

demikian pelajar  tidak perlu untuk mengingat-ingat semua perintah diatas, pelajar   hanya harus ingat bahwa huruf J=Jump, E=Equal, N=Not, S=Sign, Z=Zero,

P=Parity, O=Overflow, C=Carry, G=Greater Than, A=Above, L=Less dan B=Below. 

Ingatlah:

Huruf G dan L yang artinya Greater Than dan Less dipakai  khusus untuk operasi bilangan bertanda  . sedang  Huruf A dan B yang artinya Above dan

Below dipakai  khusus untuk operasi bilangan tidak bertanda  . 


 .MODEL SMALL 


 .CODE 


 ORG 100h 


TData : JMP Proses 


 Kal DB ' Lucky Luck menembak ',13,10 


 DB 'Lebih cepat dari bayangannya !! ',7,7,'*' 


Proses: 


 XOR BX,BX ; BX=0 


 MOV AH,02h ; Servis Untuk Cetak huruf    


 Ulang: 


 CMP Kal[BX],'*' ; Bandingkan dengan '*' 


 JE Exit ; bila  Sama Lompat ke Exit 


 MOV DL,Kal[BX] ; Masukkan huruf    ke BX menuju DL 


 INT 21h ; Cetak huruf    


 INC BX ; Tambah 1 pada BX 


 JMP Ulang ; Lompat Ke Ulang 


 Exit : INT 20h ; Selesai ! kembali ke DOS 


END TData 


program  Perbandingan


Bila program  dijalankan, maka pada layar akan ditampilkan:  Lucky Luck menembak 

Lebih cepat dari bayangannya !!  Angka 7 pada akhir kalimat dipakai  untuk menghasilkan suara beep. Bila kita masih ingat pada addressing yang sudah  pelajar  pelajari, maka program  tentunya tidak ada masalah.


STACK 

Bila pelajar  terjemahkan secara bebas, stack artinya yaitu 'tumpukan'. Stack yaitu bagian memory yang dipakai  untuk menyimpan nilai dari suatu 

register untuk sementara. Operasi- operasi pada assembler yang langsung memakai  stack contoh  pada perintah PUSH, POP, PUSF dan POPF. 

Pada program  COM yang hanya terdiri atas satu segment, yang mana kah letak  dari memory yang dipakai  untuk stack ?. Seperti pasangan CS:IP yang

menandakan  lokasi dari perintah selanjutnya yang akan dieksekusi, pada stack dipakai  pasangan SS:SP untuk menandakan  lokasi dari stack. Untuk itu 

marilah pelajar  lihat dengan debug: 


C:\>debug 

-r 

AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 

DS=3143 ES=3143 SS=3143 CS=3143 IP=0100 NV UP EI PL NZ NA PO NC 

3143:0100 0F DB 0F 

-q


Dari percobaan ini dapat pelajar  lihat bahwa SS menandakan  angka yang sama dengan CS(3143) atau dengan kata lain CS dan SS berada pada satu segment. Register IP yang menandakan  lokasi stack bernilai FFFE atau dengan kata lain stack terletak pada akhir segment. sebab  inilah pada program  COM sebaiknya  kita  jangan sembarangan mengubah data pada akhir segment, sebab  ini  akan

mengacaukan program . Bila pelajar  gambarkan letak dari stack akan tampak seperti gambar  kode   

 +--------------+ 

 | Letak Dari | 

 CS:IP_| program  |   | | 

 +--------------+ 

 | Area Kosong | 

 SS:SP_+--------------+ 

 | Tempat Stack | 

 +--------------+ 

 gambar  kode    Lokasi Stack


Seperti yang sudah  dikatakan, bahwa stack dipakai  sebagai tempat penampung sementara nilai dari suatu register. agar  lebih jelas lihatlah cara kerja dari program  


 .MODEL SMALL 


 .CODE 


 ORG 100h 


TData : JMP Proses 


 Kal DB 'LANG LING LUNG $' 


 Ganti DB 13,10,'$' 


 Stacks DW ? 


Proses: 


 LEA DX,Kal 


 MOV Stacks,DX 


 MOV AH,09 


 INT 21h 


 LEA DX,Ganti 


 INT 21h 


 MOV DX,Stacks 


 INT 21h 


 Exit : INT 20h 


END TData 


program   Mencetak kalimat 2 kali 


Bila program  dijalankan, maka pada layar akan

ditampilkan: 


LANG LING LUNG 


LANG LING LUNG 


 lihat , perintah: 


LEA DX,Kal 


MOV Stacks,DX







a