Anda di halaman 1dari 24

MODUL 1

Pengenalan Bahasa Pemograman Assembly


Pemograman bahasa assembly sering digunakan untuk mendesain sistem dasar
yang digunakan untuk mengakses intruksi dari prosessor serta memanipulasi
hardwarenya. Digunakan pada kerangka mesin yang masih sederhana yang
bertujuan meminimalkan jumlah memori yang dibandingkan oleh bahasa
pemograman tingkat tinggi. Assembler yang kita gunakan pada praktikum ini ialah
emulator8086.

Assembly Level Programming 8086


assembly programming language adalah sebuah bahasa level tingkat rendah yang
dikembangkan dengan menggunakan mnemonics. Microkontroller atau
microprocessor dapat dimengerti hanya dengan menggunakan bahasa biner seperti
0 atau 1 dengan begitu assembler menkonversikan bahasa assembly ke bahasa
biner dan menyimpan kedalam memori untuk dapat dijalankan. Sebelum menulis
program yang akan ditanamkan ke hardware, kita harus mengetahui hardware dari
kontroller atau processor, dimana kita harus juga dapat mengetahui hardware dari
processor 8086

Sistem bus yang ditunjukkan pada warna kuning mengkoneksikan berbagai


komponen pada komputer. CPU atau prosessor merupakan jantung dari komputer,
berbagai perintah akan diprogram di CPU. RAM merupakan tempat dimana
program-program akan dibaca atau disimpan.

8086 Processor Architecture


The 8086 is a processor that is represented for all peripheral devices such as serial bus ,
and RAM and ROM, I/O devices and so on which are all externally connected to CPU by
using a system bus. The 8086 microprocessor has CISC based architecture, and it has
peripherals like 32 I/O, Serial communication, memories and counters/timers. The
microprocessor requires a program to perform the operations that require a memory for read
and save the functions.

Intel 8086

8086 merupakan sebuah chip mikroprosesor 16-bit rancangan Intel pada


tahun 1978 yang membangkitkan penggunaan arsitektur x86. Tidak lama
kemudian, Intel 8088 diperkenalkan dengan bus 8-bit external, yang memungkinkan
penggunaan chipset yang murah.
8086 dirancang berdasarkan Intel 8080 dan Intel 8085 dengan set register yang
mirip, tetapi dikembangkan menjadi 16 bit. "Bus Interface Unit" memberikan
rangkaian instruksi ke "Execution Unit" melalui sebuah prefetch queue 6 byte, jadi
pemberian dan pelaksanaan dilakukan bersamaan- sebuah bentuk pipelining primitif
(instruksi 8086 bervariasi dari 1 sampai 4 byte).
Prosessor 8086 adalah prosessor yang mempresentasikan untuk semua perangkat
peripheral seperti serial bus, RAM, dan ROM, I/O device dan yanglainnya dimana semuanya
itu terkoneksi ke CPU dengan menggunakan sistem bus. Microprocessor 8086 memiliki
arsitekrur CISC, dan memiliki peripherals seperti I/O 32, komunikasi serial, memori, dan
pewaktu(counter). Microprossesor membutuhkan sebuah program untuk menjalankan
operasi ini dengan bantuan memori untuk membaca dan menyimpan berbagai macam
fungsi.
MODUL II

REGISTER DALAM ASSEMBLY

Register adalah sebagian kecil memori komputer yang dipakai untuk tempat penampungan
data dengan ketentuan bahwa data yang terdapat dalam register dapat diproses dalam
berbagai operasi dengan melihat berapa besar kemampuan menampung register tersebut.

Secara keseluruhan, CPU 8086 mempunyai 14 macam register yang dapat diakses
oleh programer, yang diklasifikasikan secara berikut :

Register Multiguna ( General Purpose Registers )

Terdiri atas 8 register atau general purpose, dimana register ini dapat digunakan
untuk memanipulasi data. Setiap register memiliki lebar data 16 bit. Ke-4 register
pertama disebut register UMUM, terdiri atas AX,BX,CX, dan DX. Sedangkan 4
register berikutnya disebut dengan register INDEX dan POINTER yang terdiri atas
register SP,BP,SI, dan DI. Khusu untuk register umum, dapat digunakan 8 bit saja
dari masing-masing registernya dengan memisahkan 8 bit tinggi (HIGH) dan 8 bit
rendah (LOW), dengan rincian sebagai berikut :

- Register AX menjadi AH dan AL


- Register BX menjadi BH dan BL
- Register CX menjadi CH dan CL
- Register DX menjadi DH dan DL

Fungsi dari masing-masing register tersebut adalah :

Register Umum ( General Registers )

AX - Merupakan register akumulator ( Dibagi menjadi AH/AL ) yang berfungsi


sebagai :
1. Membangkitkan kode mesin terpendek
2. Tempat proses aritmatika, logika dan data
3. Satu nilai harus berada didalam AL atau AX
4. Penampung hasil perkalian dan pembagian
5. Penampung proses I/O

BX - Merupakan register pengalamat dasar ( Base address register ) (dibagi menjadi


BH/BL)

CX – Merupakan register pencacah/ penghitung (dibagi menjadi CH/CL) yang


berfungsi sebagai :

1. Kode segmen iterasi yang menggunakan instruksi LOOP


2. Mengulang operasi pada string dengan perintah REP
3. Menghitung ( dalam CL ) Operasi bit untuk keperluan menggeser atau
berotasi

DX – Merupakan register data ( Dibagi menjadi DH/DL ) yang berfungsi sebagai

1. Jika digabungkan AX (DX:AX) akan menjadi register 32 bit untuk keperluan


operasi perkalian (MUL) dan Pembagian (DIV) concatenated
2. Digunakan untuk menyebutkan alamat port pada operasi IN dan OUT

PENGERTIAN REGISTER DAN MACAM-MACAM REGISTER

Register ialah sebagian kecil memori komputer yang dipakai untuk tempat
penampungan data dengan ketentuan bahwa data yang terdapat dalam register
dapat diproses dalam berbagai operasi dengan melihat berapa besar kemampuan
menampung register tersebut.
Register terbagi dalam 5 golongan antara lain:
- General Purpose Register (Scratch-Pad Register), terdiri dari:

• AX (AH + AL) - Accumulator Register


• BX (BH + BL) - Base Register
• CX (CH + CL) - Counter Register
• DX (DH + DL) - Data Register

- Segment Register

• CS - Code Segment Register


• DS - Data Segment Register
• SS - Stack Segment Register
• ES - Extra Segment Register
- Pointer Register

• IP - Instruction Pointer Register


• SP - Stack Pointer Register
• BP - Base Pointer Register

- Index Register

• SI - Source Index Register


• DI - Destination Index Register

- Flag Register

GENERAL PURPOSE REGISTER


General Purpose Register terdiri dari emapt register yang mempunyai kemampuan
16 bit dan dapat dibagi menjadi Register Low dan High Bits yang masing-masing
berkemampuan 8 bit.

Register AX
Register AX merupakan register aritmatik, karena register ini selalu dipakai dalam
operasi penambahan, pengurangan, perkalian dan pembagian.
Setiap register general purpose mempunyai Register Low dan Register High, maka
untuk AX register low-nya adlaah AL dan register high-nya adalah AH. Register AH
merupakan tempat menaruh nilai service number untuk beberapa Interrupt tertentu.

Register BX
Register BX adalah salah satu dari dua register base Addressing Mode yang dapat
mengambil atau menulis langsung dari atau ke memori.

Register CX
Register CX merupakan suatu counter untuk meletakkan jumlah lompatan pada
Loop yang anda lakukan.

Register DX
Register DX memiliki 3 tugas antara lain:
Membantu AX dalam proses perkalian dan pembagian, terutama perkalian dan
pembagian 16 bit.
DX merupakan register offset dari DS
DX bertugas menunjukkan nomor port pada operasi port

POINTER REGISTER
Pointer Register bertugas untuk menyimpan offset dari relative address.

Register IP
Pasangan register IP adalah register CS yang merupakan register terpenting untuk
menunjukkan baris perintah program. Pada pertama program dijalankan register ini
akan langsung menunjuk pada awal program.

Register SP
Pasangan register SP adalah register SS yang digunakan untuk operasi stack. Pada
saat program pertama dijalankan register ini akan menunjuk pada byte terakhir
stack.

Register BP
Register BP mempunyai fungsi yang sama dengan register BX yaitu dapat menulis
dan membaca ke atau dari memori secara langsung.
Perbedaannya adalah BX menulis dan membaca dengan segment SS (Stack
Segment).
Register BP digunakan juga dalam komunikasi anatara bahasa komputer, seperti
PASCAL dengan Assembler ataupun Turbo C dengan Assembler.

INDEX REGISTER
Index Register terdiri dari dua register yaitu register DI dan SI, dimana kedua
register ini merupakan register yang dipakai untuk melakukan Operasi String.
Kedua register ini sering digunakan untuk menulis dan membaca ke atau dari
memori seperti BX dan BP

FLAG REGISTER

| X | X | X | X | O | D | I |T | S | Z | X | A | X | P | X | C |

Flag Bits:
O - Overflow Flag
D - Direction Flag
I - Interrupt Flag
T - Trap Flag
S - Sign Flag
Z - Zero Flag
A - Auxiliary Carry Flag
P - Parity Flag
C - Carry Flag
X - Reserved (kosong)

Flag register ini merupakan suatu komposisi register 16 bit dengan


ketentuan seperti gambar diatas, dimana komposisi bit nya dapat mengecek apakah
sesuatu berfungsi atau tidak.
MODUL III

MEMBUAT PROGRAM SEDERHANA


MEMBUAT PROGRAM “ HELLO WORLD “
MODUL IV
Perintah Dasar Bahasa Assembly Menggunakan Emulator 8086

MODEL SMALL
Tanda directive ini digunakan untuk memberitahukan kepada assembler bentuk
memory yang digunakan oleh program kita. Supaya lebih jelas model-model yang
bisa digunakan adalah :
– TINY
Jika program anda hanya menggunakan 1 segment seperti program COM. Model ini
disediakan khusus untuk program COM.
– SMALL
Jika data dan code yang digunakan oleh program kurang dari ukuran 1 segment
atau 64 KB.
– MEDIUM
Jika data yang digunakan oleh program kurang dari 64 KB tetapi code yang
digunakan bisa lebih dari 64 KB.
– COMPACT
Jika data yang digunakan bisa lebih besar dari 64 KB tetapi codenya kurang dari 64
KB.
– LARGE
Jika data dan code yang dipakai oleh program bisa lebih dari 64 KB.
– HUGE
Jika data, code maupun array yang digunakan bisa lebih dari 64 KB.
Mungkin ada yang bertanya-tanya mengapa pada program COM yang dibuat
digunakan model SMALL dan bukannya TINY ?Hal ini disebabkan karena banyak
dari compiler bahasa tingkat tinggi yang tidak bisa berkomunikasi dengan model
TINY, sehingga kita menggunakan model SMALL sebagai pemecahannya.
.CODE
Tanda directive ini digunakan untuk memberitahukan kepada assembler bahwa kita
akan mulai menggunakan Code Segment-nya disini. Code segment ini digunakan
untuk menyimpan program yang nantinya akan dijalankan.
.ORG 100h
Pada program COM perintah ini akan selalu digunakan. Perintah ini digunakan untuk
memberitahukan assembler supaya program pada saat dijalankan(diload ke
memory) ditaruh mulai pada offset ke 100h(256) byte. Dapat dikatakan juga bahwa
kita menyediakan 100h byte kosong pada saat program dijalankan. 100h byte
kosong ini nantinya akan ditempati oleh PSP(Program Segment Prefix) dari program
tersebut. PSP ini digunakan oleh DOS untuk mengontrol jalannya program tersebut.
JMP
Perintah JMP(JUMP) ini digunakan untuk melompat menuju tempat yang
ditunjukkan oleh perintah JUMP. Adapun syntaxnya adalah:
JUMP Tujuan .
Dimana tujuannya dapat berupa label seperti yang digunakan pada bagan diatas.
Mengenai perintah JUMP ini akan kita bahas lebih lanjut nantinya.
Perintah JUMP yang digunakan pada bagan diatas dimaksudkan agar melewati
tempat data program, karena jika tidak ada perintah JUMP ini maka data program
akan ikut dieksekusi sehingga kemungkinan besar akan menyebabkan program
anda menjadi Hang.
INT 20h
Perintah INT adalah 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 tetapi
cara inilah yang paling efektif untuk digunakan. Bila anda lupa untuk mengakhiri
sebuah program maka program anda tidak akan tahu kapan harus selesai, hal ini
akan menyebabkan komputer menjadi hang.

Helloworld versi II
.model tiny ; com program

.code ; code segment

org 100h ; code starts at offset 100h

main proc near

mov ah,09h ; function to display a string

mov dx,offset message ; offset ofMessage string terminating with $

int 21h ; dos interrupt

mov ah,4ch ; function to terminate

mov al,00

int 21h ; Dos Interrupt

endp

message db "Hello World $" ; Message to be displayed terminating with a $


end main
MODUL V
PENGULANGAN DENGAN LOOP

name "loops"

org 100h

mov bx, 0 ; total step counter

mov cx, 5

k1: add bx, 1

mov al, '1'

mov ah, 0eh

int 10h

push cx

mov cx, 5

k2: add bx, 1

mov al, '2'


mov ah, 0eh

int 10h

push cx

mov cx, 5

k3: add bx, 1

mov al, '3'

mov ah, 0eh

int 10h

loop k3 ; internal in internal loop.

pop cx

loop k2 ; internal loop.

pop cx

loop k1 ; external loop.

; wait any key...

mov ah, 1

int 21h

ret
MODUL VI

MEMBUAT INPUT STRING KE EMU8086

Bahasa pemograman tingkat rendah dapat digunakan untuk masukan input kedalam mikrokontroller,
perintah tersebut didasarkan pada setiap data string yang diberikan ke register-registernya. Sama
halnya dengan bahasa yang lain, maka keluaran atau output dapat diperoleh ketika input dalam hal
ini keyboard tersebut.

name "charchar"

org 100h

print_new_line macro

mov dl, 13

mov ah, 2

int 21h

mov dl, 10

mov ah, 2

int 21h

endm

mov dx, offset msg1


mov ah, 9

int 21h

; input the string:

mov dx, offset s1

mov ah, 0ah

int 21h

; get actual string size:

xor cx, cx

mov cl, s1[1]

print_new_line

mov bx, offset s1[2]

print_char:

mov dl, [bx]

mov ah, 2

int 21h

print_new_line

inc bx

loop print_char

; wait for any key...

mov ax, 0

int 16h

ret

msg1 db "ENTER THE STRING: $"

s1 db 100,?, 100 dup(' ')


end

MODUL VII

PROGRAM LED DAN STEPPER MOTOR

; this
sample
prints
16x16
color
map,
; it uses all possible colors.
name "colors"
org 100h
; set video mode:
; text mode. 80x25. 16 colors. 8 pages.
mov ax, 3
int 10h
; blinking disabled for compatibility with dos,
; emulator and windows prompt do not blink anyway.
mov ax, 1003h
mov bx, 0 ; disable blinking.
int 10h

mov dl, 0 ; current column.


mov dh, 0 ; current row.
mov bl, 0 ; current attributes.
jmp next_char
next_row:
inc dh
cmp dh, 16
je stop_print
mov dl, 0
next_char:
; set cursor position at (dl,dh):
mov ah, 02h
int 10h
mov al, 'a'
mov bh, 0
mov cx, 1
mov ah, 09h
int 10h
inc bl ; next attributes.
inc dl
cmp dl, 16
je next_row
jmp next_char
stop_print:
; set cursor position at (dl,dh):
mov dl, 10 ; column.
mov dh, 5 ; row.
mov ah, 02h
int 10h
; test of teletype output,
; it uses color attributes
; at current cursor position:
mov al, 'x'
mov ah, 0eh
int 10h
; wait for any key press:
mov ah, 0
int 16h
ret

DISPLAY LED TEST


#start=led_display.exe#

#make_bin#

name "led"
mov ax, 1234

out 199, ax

mov ax, -5678

out 199, ax

; Eternal loop to write

; values to port:

mov ax, 0

x1:

out 199, ax

inc ax

jmp x1

hlt

STEPPER MOTOR
#start=stepper_motor.exe#

name "stepper"

#make_bin#

steps_before_direction_change = 20h ; 32 (decimal)

jmp start

; ========= data ===============


; bin data for clock-wise

; half-step rotation:

datcw db 0000_0110b

db 0000_0100b

db 0000_0011b

db 0000_0010b

; bin data for counter-clock-wise

; half-step rotation:

datccw db 0000_0011b

db 0000_0001b

db 0000_0110b

db 0000_0010b

; bin data for clock-wise

; full-step rotation:

datcw_fs db 0000_0001b

db 0000_0011b

db 0000_0110b

db 0000_0000b

; bin data for counter-clock-wise

; full-step rotation:

datccw_fs db 0000_0100b

db 0000_0110b

db 0000_0011b

db 0000_0000b

start:

mov bx, offset datcw ; start from clock-wise half-step.

mov si, 0

mov cx, 0 ; step counter


next_step:

; motor sets top bit when it's ready to accept new command

wait: in al, 7

test al, 10000000b

jz wait

mov al, [bx][si]

out 7, al

inc si

cmp si, 4

jb next_step

mov si, 0

inc cx

cmp cx, steps_before_direction_change

jb next_step

mov cx, 0

add bx, 4 ; next bin data

cmp bx, offset datccw_fs

jbe next_step

mov bx, offset datcw ; return to clock-wise half-step.

jmp next_step
MODUL VIII

APLIKASI BAHASA PEMOGRAMAN : ROBOT SEDERHANA

#start=robot.exe#

name "robot"

#make_bin#

#cs = 500#

#ds = 500#

#ss = 500# ; stack

#sp = ffff#

#ip = 0#
; this is an example of contoling the robot.

; this code randomly moves the robot,

; and makes it to switch the lamps on and off.

; robot is a mechanical creature and it takes

; some time for it to complete a task.

; status register is used to see if robot is busy or not.

; c:\emu8086\devices\robot.exe uses ports 9, 10 and 11

; source code of the robot and other devices is in:

; c:\emu8086\devices\developer\sources\

; robot is programmed in visual basic 6.0

; robot base i/o port:

r_port equ 9

;===================================

eternal_loop:

; wait until robot

; is ready:

call wait_robot

; examine the area

; in front of the robot:

mov al, 4

out r_port, al

call wait_exam
; get result from

; data register:

in al, r_port + 1

; nothing found?

cmp al, 0

je cont ; - yes, so continue.

; wall?

cmp al, 255

je cont ; - yes, so continue.

; switched-on lamp?

cmp al, 7

jne lamp_off ; - no, so skip.

; - yes, so switch it off,

; and turn:

call switch_off_lamp

jmp cont ; continue

lamp_off: nop

; if gets here, then we have

; switched-off lamp, because

; all other situations checked

; already:

call switch_on_lamp

cont:

call random_turn
call wait_robot

; try to step forward:

mov al, 1

out r_port, al

call wait_robot

; try to step forward again:

mov al, 1

out r_port, al

jmp eternal_loop ; go again!

;===================================

; this procedure does not

; return until robot is ready

; to receive next command:

wait_robot proc

; check if robot busy:

busy: in al, r_port+2

test al, 00000010b

jnz busy ; busy, so wait.

ret

wait_robot endp

;===================================

; this procedure does not

; return until robot completes

; the examination:
wait_exam proc

; check if has new data:

busy2: in al, r_port+2

test al, 00000001b

jz busy2 ; no new data, so wait.

ret

wait_exam endp

;===================================

; switch off the lamp:

switch_off_lamp proc

mov al, 6

out r_port, al

ret

switch_off_lamp endp

;===================================

; switch on the lamp:

switch_on_lamp proc

mov al, 5

out r_port, al

ret

switch_on_lamp endp

;===================================

; generates a random turn using

; system timer:

random_turn proc
; get number of clock

; ticks since midnight

; in cx:dx

mov ah, 0

int 1ah

; randomize using xor:

xor dh, dl

xor ch, cl

xor ch, dh

test ch, 2

jz no_turn

test ch, 1

jnz turn_right

; turn left:

mov al, 2

out r_port, al

; exit from procedure:

ret

turn_right:

mov al, 3

out r_port, al

no_turn:

ret

random_turn endp

;===================================

Anda mungkin juga menyukai