Intel 8086
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 :
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 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:
- Segment Register
- Index Register
- Flag Register
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)
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
mov al,00
endp
name "loops"
org 100h
mov cx, 5
int 10h
push cx
mov cx, 5
int 10h
push cx
mov cx, 5
int 10h
pop cx
pop cx
mov ah, 1
int 21h
ret
MODUL VI
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
int 21h
int 21h
xor cx, cx
print_new_line
print_char:
mov ah, 2
int 21h
print_new_line
inc bx
loop print_char
mov ax, 0
int 16h
ret
MODUL VII
; 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
#make_bin#
name "led"
mov ax, 1234
out 199, ax
out 199, ax
; 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#
jmp start
; half-step rotation:
datcw db 0000_0110b
db 0000_0100b
db 0000_0011b
db 0000_0010b
; half-step rotation:
datccw db 0000_0011b
db 0000_0001b
db 0000_0110b
db 0000_0010b
; full-step rotation:
datcw_fs db 0000_0001b
db 0000_0011b
db 0000_0110b
db 0000_0000b
; full-step rotation:
datccw_fs db 0000_0100b
db 0000_0110b
db 0000_0011b
db 0000_0000b
start:
mov si, 0
; motor sets top bit when it's ready to accept new command
wait: in al, 7
jz wait
out 7, al
inc si
cmp si, 4
jb next_step
mov si, 0
inc cx
jb next_step
mov cx, 0
jbe next_step
jmp next_step
MODUL VIII
#start=robot.exe#
name "robot"
#make_bin#
#cs = 500#
#ds = 500#
#sp = ffff#
#ip = 0#
; this is an example of contoling the robot.
; c:\emu8086\devices\developer\sources\
r_port equ 9
;===================================
eternal_loop:
; is ready:
call wait_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
; wall?
; switched-on lamp?
cmp al, 7
; and turn:
call switch_off_lamp
lamp_off: nop
; already:
call switch_on_lamp
cont:
call random_turn
call wait_robot
mov al, 1
out r_port, al
call wait_robot
mov al, 1
out r_port, al
;===================================
wait_robot proc
ret
wait_robot endp
;===================================
; the examination:
wait_exam proc
ret
wait_exam endp
;===================================
switch_off_lamp proc
mov al, 6
out r_port, al
ret
switch_off_lamp endp
;===================================
switch_on_lamp proc
mov al, 5
out r_port, al
ret
switch_on_lamp endp
;===================================
; system timer:
random_turn proc
; get number of clock
; in cx:dx
mov ah, 0
int 1ah
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
ret
turn_right:
mov al, 3
out r_port, al
no_turn:
ret
random_turn endp
;===================================