Instruksi Mesin µP 8088 Instruksi mesin (machine instruction) adalah instruksi-instruksi yg dapat dikerjakan oleh suatu mikroprosesor. Suatu program bahasa Pascal tidak akan dapat dieksekusi secara langsung oleh mikroprosesor, sehingga agar mikroprosesor dapat mengerti isi program tersebut, terlebih dahulu kita harus meng-compile program tersebut agar menjadi instruksi mesin. Bahasa PASCAL Begin
inline($90/ $90/ $90); exit; inline($90/ $90/ $90); end.
Hasil Compile 0F9C:0000 0F9C:0005 0F9C:0006 0F9C:0008 0F9C:000A 0F9C:000F 0F9C:0010 0F9C:0011 0F9C:0012 0F9C:0014 0F9C:0015 0F9C:0016 0F9C:0017
9A00009E0F 55 89E5 31C0 9ACD029E0F 90 90 90 EB03 90 90 90 5D
CALL PUSH MOV XOR CALL NOP NOP NOP JMP NOP NOP NOP POP
0F9E:0000 BP BP,SP AX,AX 0F9E:02CD
0017
BP
Pada contoh diatas tampak bahwa hasil penterjemahan instruksi PASCAL “exit” adalah instruksi mesin “JMP”. Dilihat dari fungsi yg dilakukannya, instruksi mesin di µP 8088 dapat dibedakan menjadi 3, yaitu : Data transfer digunakan untuk (1) memindahkan data dari suatu elemen memory ke elemen memory lainnya atau (2) mengisi register data dengan suatu data. Contoh: MOV, PUSH, POP Aritmetika dan Logika digunakan untuk mengkalkulasi suatu perhitungan aritmetika (contoh: ADD, SUB, MUL, DIV) dan logika (contoh: AND, OR, NOT, XOR, SHL, SHR) Kontrol digunakan untuk memindahkan kontrol instruksi ke suatu lokasi baru (tidak lagi secara sekuensial). Contoh: JMP, JZ, JE
Instruksi MOV 1. Register ! Data (data yg akan ditulis ke register ditulis langsung di instruksi) 2. Register ! Register (data yg akan ditulis ke register berasal dari register lainnya) 3. Register ! Memory (data yg akan ditulis ke register berasal dari memory, dan alamat dari data disimpan di register alamat) 4. Memory ! Register (data yg akan ditulis ke memory berasal dari register, dan alamat memory yg akan ditulis disimpan di register alamat) Contoh instruksi MOV untuk pengisian langsung (1) dan transfer antar register (2) -a 0F6C:0100 0F6C:0103 0F6C:0105 0F6C:0107 0F6C:0109
mov mov mov mov
bx,abcd ah,56 bl,ah ax,bx
" " " "
mengisi reg. mengisi reg. mengcopy isi mengcopy isi
AX dgn data ABCDH AH dgn data 56H reg. AH ke reg. BL reg. BX ke reg. AX
-r AX=0000 BX=0000 DS=0F6C ES=0F6C 0F6C:0100 BBCDAB
CX=0000 DX=0000 SP=FFEE SS=0F6C CS=0F6C IP=0100 MOV BX,ABCD
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-t AX=0000 BX=ABCD DS=0F6C ES=0F6C 0F6C:0103 B456
CX=0000 DX=0000 SP=FFEE SS=0F6C CS=0F6C IP=0103 MOV AH,56
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-t AX=5600 BX=ABCD DS=0F6C ES=0F6C 0F6C:0105 88E3
CX=0000 DX=0000 SP=FFEE SS=0F6C CS=0F6C IP=0105 MOV BL,AH
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-t AX=5600 BX=AB56 DS=0F6C ES=0F6C 0F6C:0107 89D8
CX=0000 DX=0000 SP=FFEE SS=0F6C CS=0F6C IP=0107 MOV AX,BX
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-t AX=AB56 DS=0F6C
CX=0000 SS=0F6C
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
BX=AB56 ES=0F6C
DX=0000 CS=0F6C
SP=FFEE IP=0109
catatan: Instruksi berikut akan menimbulkan Error : mov ch,5678 : tidak bisa karena CH = 1 byte dan datanya 2 byte mov dl,ax : tidak bisa karena AX = 2 byte dan DL = 1 byte mov dx,al : tidak bisa karena AL = 1 byte dan DX = 2 byte
Contoh instruksi MOV untuk transfer Register ! Memory (3) dan transfer Memory ! Register (4) -a 0F6C:0100 0F6C:0103 0F6C:0105 0F6C:0107 0F6C:010A 0F6C:010C -d 0F6C:0000 0F6C:0010 0F6C:0020 0F6C:0030 0F6C:0040 0F6C:0050 0F6C:0060 0F6C:0070
mov mov mov mov mov
00 10 20 30 40 50 60 70
bx,0002 ah,[bx] ax,[bx] ax,[bx+1] [bx],ax
01 11 21 31 41 51 61 71
02 12 22 32 42 52 62 72
03 13 23 33 43 53 63 73
" " " " "
04 14 24 34 44 54 64 74
mengisi membaca membaca membaca menulis
05 15 25 35 45 55 65 75
06 16 26 36 46 56 66 76
reg. BX dgn memori pada memori pada memori pada isi reg. AX
07-08 17-18 27-28 37-38 47-48 57-58 67-68 77-78
09 19 29 39 49 59 69 79
0A 1A 2A 3A 4A 5A 6A 7A
0B 1B 2B 3B 4B 5B 6B 7B
data 0002H alamat BX sebanyak 1 byte (AH) alamat BX sebanyak 2 byte (AX) alamat BX+1 sbanyak 2 byte (AX) ke memori pada alamat BX
0C 1C 2C 3C 4C 5C 6C 7C
0D 1D 2D 3D 4D 5D 6D 7D
0E 1E 2E 3E 4E 5E 6E 7E
0F 1F 2F 3F 4F 5F 6F 7F
................ ................ !”#$%&’()*+,-./ 0123456789:;#? @ABCDEFGHIJKLMNO PQRSTUVWXYZ[\]^_ `abcdefghijklmno pqrstuvwxyz{|}~.
-r AX=0000 BX=0000 DS=0F6C ES=0F6C 0F6C:0100 BB0200
CX=0000 DX=0000 SP=FFEE SS=0F6C CS=0F6C IP=0100 MOV BX,0002
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-t AX=0000 BX=0002 DS=0F6C ES=0F6C 0F6C:0103 8A27
CX=0000 DX=0000 SP=FFEE SS=0F6C CS=0F6C IP=0103 MOV AH,[BX]
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC DS:0002=02
-t AX=0200 BX=0002 DS=0F6C ES=0F6C 0F6C:0105 8B07
CX=0000 DX=0000 SP=FFEE SS=0F6C CS=0F6C IP=0105 MOV AX,[BX]
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC DS:0002=0302
-t AX=0302 BX=0002 DS=0F6C ES=0F6C 0F6C:0107 8B4701
CX=0000 DX=0000 SP=FFEE SS=0F6C CS=0F6C IP=0107 MOV AX,[BX+01]
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC DS:0003=0403
-t AX=0403 BX=0002 DS=0F6C ES=0F6C 0F6C:010A 8907
CX=0000 DX=0000 SP=FFEE SS=0F6C CS=0F6C IP=010A MOV [BX],AX
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC DS:0002=0302
-t AX=00A0 BX=0002 DS=0F6C ES=0F6C 0F6C:010C 90
CX=0000 DX=0000 SS=0F6C CS=0F6C NOP
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-d 0F6C:0000 0F6C:0010 0F6C:0020 0F6C:0030
00 10 20 30
01 11 21 31
03 12 22 32
04 13 23 33
04 14 24 34
05 15 25 35
06 16 26 36
SP=FFEE IP=010C
07-08 17-18 27-28 37-38
09 19 29 39
0A 1A 2A 3A
0B 1B 2B 3B
0C 1C 2C 3C
0D 1D 2D 3D
0E 1E 2E 3E
0F 1F 2F 3F
................ ................ !”#$%&’()*+,-./ 0123456789:;#?
0F6C:0040 0F6C:0050 0F6C:0060 0F6C:0070
40 50 60 70
41 51 61 71
42 52 62 72
43 53 63 73
44 54 64 74
45 55 65 75
46 56 66 76
47-48 57-58 67-68 77-78
49 59 69 79
4A 5A 6A 7A
4B 5B 6B 7B
4C 5C 6C 7C
4D 5D 6D 7D
4E 5E 6E 7E
4F 5F 6F 7F
@ABCDEFGHIJKLMNO PQRSTUVWXYZ[\]^_ `abcdefghijklmno pqrstuvwxyz{|}~.
Catatan: Instruksi berikut akan menimbulkan Error : mov [bx],[bx+1] : transfer data dari memori ke memori secara langsung mov [bx],12 : transfer data langsung ke memori kesimpulan : semua transfer yg melibatkan memori harus via register mov ah,[bl] mov [ax],bx mov [cx],bx mov [dx],bx
: : : :
register alamat harus digunakan dalam format 2 byte reg. AX bukan register alamat reg. CX bukan register alamat reg. DX bukan register alamat
Instruksi PUSH & POP Instruksi PUSH dan POP akan dipelajari lebih lanjut di bagian mengenai STACK (halaman berikutnya). Instruksi ADD dan SUB Contoh Penggunaan Instruksi Aritmatika (ADD dan SUB) -a 0DA0:0100 0DA0:0103 0DA0:0106 0DA0:0108 0DA0:010A
mov mov add sub
ax,1234 bx,5678 ax,bx ax,bx
-t " trace MOV AX,1234 AX=1234 BX=0000 CX=0000 DX=0000 SP=FFEE DS=0DA0 ES=0DA0 SS=0DA0 CS=0DA0 IP=0103 0DA0:0103 BB7856 MOV BX,5678
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-t " trace MOV BX,5678 AX=1234 BX=5678 CX=0000 DX=0000 SP=FFEE DS=0DA0 ES=0DA0 SS=0DA0 CS=0DA0 IP=0106 0DA0:0106 01D8 ADD AX,BX
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-t " trace ADD AX,BX AX=68AC BX=5678 CX=0000 DX=0000 SP=FFEE DS=0DA0 ES=0DA0 SS=0DA0 CS=0DA0 IP=0108 0DA0:0108 29D8 SUB AX,BX
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PE NC
-t " trace SUB AX,BX AX=1234 BX=5678 CX=0000 DS=0DA0 ES=0DA0 SS=0DA0
DX=0000 CS=0DA0
SP=FFEE IP=010A
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
Instruksi JMP dan JZ Contoh Penggunaan Instruksi Control (JMP dan JZ) -a 0F6C:0100 0F6C:0103 0F6C:0106 0F6C:0108 0F6C:010A 0F6C:010C 0F6C:010E
MOV MOV XOR JMP MOV JZ
AX,ABCD BX,DCBA AL,AL 010C AL,BH 010E
-t " trace MOV AX,ABCD AX=ABCD BX=0000 CX=0000 DX=0000 DS=0F6C ES=0F6C SS=0F6C CS=0F6C
SP=FFEE IP=0103
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-t " trace MOV BX,DCBA AX=ABCD BX=DCBA CX=0000 DX=0000 DS=0F6C ES=0F6C SS=0F6C CS=0F6C
SP=FFEE IP=0106
BP=0000 SI=0000 DI=0000 NV UP EI PL NZ NA PO NC
-t " trace XOR AL,AL AX=AB00 BX=DCBA CX=0000 DS=0F6C ES=0F6C SS=0F6C
DX=0000 CS=0F6C
SP=FFEE IP=0108
BP=0000 SI=0000 DI=0000 NV UP EI PL ZR NA PE NC
-t " trace JMP 010C AX=AB00 BX=DCBA CX=0000 DS=0F6C ES=0F6C SS=0F6C
DX=0000 CS=0F6C
SP=FFEE IP=010C
BP=0000 SI=0000 DI=0000 NV UP EI PL ZR NA PE NC
-t " trace JZ 010E AX=AB00 BX=DCBA CX=0000 DS=0F6C ES=0F6C SS=0F6C
DX=0000 CS=0F6C
SP=FFEE IP=010E
BP=0000 SI=0000 DI=0000 NV UP EI PL ZR NA PE NC