Saturday, October 23, 2010

Perihal Flag Part 3(Katak Ikut Arahan)

Sebelum ni kita faham JMP iaitu JUMP atau lompat berfungsi. Jadi apa kaitannya?
Segalanya berkaitan dengan arahan CMP. Sebagai contoh

mula:
CMP AX,5
JE mati
JMP mula
mati:

Jika anda memahami post yang sebelum ini mengenai uncondition jump(JMP) anda pasti faham JMP mula bermaksud apa. Sila rujuk ilustrasi dalam pos terdahulu mengania JMP.

Untuk meneruskan pemahaman kita. Anda tertanya apa dia JE? JE atau Jump Equal bermaksud arahan untuk melakukan operasi sama seperti JMP tetapi dengan syarat AX = 5. Walau bagaimanapun dalam Pos yang sebelum ini telah dinyatakan bahawa CMP serupa dengan SUB di mana nilai kiri akan ditolak dengan yang kanan. sebagai cth:
SUB kiri, kanan sama dengan kiri=kiri-kanan
SUB AX, 5 sama dengan AX=AX-5

perbezaan SUB dengan CMP adalah SUB mengubah nilai sebelah kiri tetapi CMP tidak. Walaubagaimanapun kedua-duanya akan mengubah nilai flag.

Seperti contoh yang tadi iaitu:

mula: ;label mula
CMP AX,5 ;Lakukan perbandingan sila rujuk Perihal Flag Part 1
JE mati ; JMP ke mati
JMP mula ;kembali ke mula.
mati: ;label mati

Di atas menunjukkan CMP AX, 5 bermaksud untuk membandingkan nilai AX dengan 5(rujuk Perihal Flag Part 1). JE akan berfungsi seperti JMP seandainya AX = 5 kerana Jump if Equal(JE) bermaksud lompat jika sama. Dalam arti kata lainnya kalau AX = 5 ia akan pergi ke label 'mati'. Jika tidak JMP akan kembali ke mula dan meneruskan operasi.

JE memerlukan AX=5 oleh yang demikian CMP AX,5 akan memastikan AX=AX-5 dan ia akan memberikan nilai 0 yang menyebabkan Zero Flag(ZF) = 1. Arahan seperti JE akan melaksanakan operasi dengan melihat nilai di dalam Flag, bukan perubahan nilai dalam register seperti AX kerana fungsi CMP bukannya mengubah AX.

Selain dari JE terdapat arahan lain seperti JA(Jump if above). Di mana fungsinya sama seperti JE tetapi dengan syarat nilai berpandingan lebih besar. Sebagai contoh

mula:
CMP AX,5
JA mati
JMP mula
mati:

Arahan di atas adalah untuk membandingkan AX dengan 5 tetapi kali ini AX mestilah lebih besar dari 5 (AX>5) untuk ke label 'mati'. Jika tidak ia lompat(JMP) ke label mula. Seperti yang kita fahami sebelum ini ia bergantung pada perubahan flag. Dalam keadaan ini sudah pasti nilai AX lebih besar dari 5. Oleh itu jika AX=AX-5 akan menghasilkan nilai positif tetapi bukan kosong. Dalam post Perihal Flag Part 1 telak dinyatakan keadaan ini menyebabkan ZF=0 dan CF=0. Perubahan flag inilah yang menyebabkan arahan JA melakukan operasinya.

Untuk rujukan lanjut sila rujuk jadual di bawah.















































Arahan Penerangan Flag untunk lompat(JUMP) CMP kiri, kanan
ja jump if above CF=0 dan ZF=0 kiri > kanan
jnbe jump if not below or equal CF=0 dan ZF=0 kiri > kanan
jae jump if above or equal CF=0 kiri >= kanan
jb jump if below CF=1 kiri < kanan
jbe jump if below or equal CF=1 atau ZF=1 kiri <= kanan
je jump if equal ZF=1 kiri == kanan


Jika ada apa-apa komen serta cadangan sila jangan segan silu memberi komen serta menghubungi penulis.
Wassalam.
,  

Friday, October 22, 2010

Perihal Flag Part 2(Lompat Si Katak Lompat)

Sekarang kita tau apa yang berlaku pada Flag semasa operasi Compare(CMP).
Dari sudut bahasa Compare bermaksud Banding. Oleh itu:
CMP AX,2 bermaksud Bandingkan AX dengan 2
CMP kiri, kanan bermaksud Bandingkan kiri dengan kanan.

Seperti yang kita fahami dari artikel yang sebelumnya(Perihal Flag Part 1):
Flag berubah kalau kita Compare(CMP) atau Subtitute(SUB). JUMP(JMP,JE, JB, JG, JGE, JBE) bergantung dengan flag.
Apa gunanya JUMP? Untuk melompat la dari satu 'Label' ke 'Label' yang lain.

Unconditional Jump

Pertama sekali, kita kena faham konsep unconditional JUMP yang menggunakan arahan JMP.

bentuk asas arahan JMP adalah seperti di bawah.
JMP Label
Label: (operasi)

dibawah adalah ilustrasi bagaimana arahan JMP berfungsi

Pertama,

0. JMP pergi ke Label

1. Dalam 'Label' ada arahan JMP ke 'Mahmud'

2.Pergi ke 'Mahmud', dalam ada arahan JMP ke 'Ali'

3.Berakhir dekat 'Ali' sebab takde arahan JMP.

Paham tak?
,  

Perihal Flag Part 1(CMP dan SUB)

Pertama kita akan concentrate dengan 2 jenis Flag:
  1. Carry Flag(CF)
  2. Zero Flag(ZF)
  3. Sign Flag(SF)
Kedua kita akan tengok apa berlaku pada kedua-dua flag ni bila seru command:
  1. Compare(CMP)
  2. Subtitute(SUB)
Command Compare(CMP) dengan Subtitute(SUB) ada persamaan iaitu kedua-duanya melakukan operasi TOLAK. Cth.

SUB AX, BX adalah AX= AX-BX
SUB AX,2 adalah AX=AX-2

beza CMP dengan SUB adalah CMP takkan ubah nilai kecuali flag.
Cth:
CMP AX, BX tidak akan ubah nilai AX seperti sub tetapi akan melakukan operasi sama
CMP AX, 2 juga tidak akan ubah nilai AX seperti diterangkan tadi.

Sekarang mari kita lihat apa yang berlaku pada Flag.
Sebagai contoh sekarang nilai AX= 0002



















ASSEMBLY
AX
Carry Flag(CF)
Zero Flag(ZF)
Sign Flag(SF)
SUB AX,2
0000
0
1
0
CMP AX,2
0002
0
1
0
Di atas kita dapat lihat perbezaan antara SUB dengan CMP dimana CMP tidak mengubah nilai AX tetapi kedua-duanya akan mengubah nilai FLAG.

Cuba perhatikan contoh seterusnya
AX=0002


















ASSEMBLY
AX
Carry Flag(CF)
Zero Flag(ZF)
Sign Flag(SF)
SUB AX,4
FFFE
1
0
1
CMP AX,4
0002
1
0
1

AX=0002 lagi

















ASSEMBLY
AX
Carry Flag(CF)
Zero Flag(ZF)
Sign Flag(SF)
SUB AX,1
0001
0
0
0
CMP AX,1
0002
0
0
0

Berdasarkan pada ketiga-tiga contoh kita dapat rumuskan sebagai:
SUB kiri,kanan sebagai:





















ASSEMBLY
Nilai Kiri
Carry Flag(CF)
Zero Flag(ZF)
Sign Flag(SF)
Kiri = Kanan
0
0
1
0
Kiri < Kanan Negatif
1
0
1
Kiri > Kanan Positif
0
0
0
CMP kiri, kanan sebagai





















ASSEMBLY
Nilai Kiri
Carry Flag(CF)
Zero Flag(ZF)
Sign Flag(SF)
Kiri = Kanan
Tak Berubah
0
1
0
Kiri < Kanan Tak Berubah1
0
1
Kiri > Kanan Tak Berubah0
0
0
Buat masa sekarang itu saja yang mampu diterangkan perihal FLAG. Ada apa-apa persoalan sila nyatakan pada comment atau e-mail atau twitter.
Wallahua'lam.
,