Mengenal Instruksi Aritmatika dan Flag Microcomputer


Setiap instruksi aritmatika dan logika berpengaruh pada register status pada prosesor atau yang disebut dengan istilah flag.
Carry Flag (CF), flag ini bernilai 1 jika ada unsigned overflow. Contoh saat menambah byte 255 + 1, hasilnya tidak di jangkauan. Saat tidak ada overflow flag ini bernilai 0.
Zero Flag (ZF), bernilai 1 jika hasilnya zero. Untuk hasil selain zero, bernilai 0.
Sign Flag (SF), bernilai 1 jika hasilnya negative. Saat hasilnya positive bernilai 0. Sebenarnya flag ini mengambil nilai dari MSB (Most Significant Bit).
Overflow Flag (OF), bernilai 1 saat ada signed overflow. Contohnya, jika menambah byte 100 + 50, hasilnya diluar nilai -128 dan 127.
Parity Flag (PF), bernilai 1 jika ada angka genap dari satu bit dalam hasilnya , dan di set ke 0 jika ada angka ganjil. Jika hasilnya berupa word hanya 8 low bit yang diperiksa.
Auxiliary Flag (AF), bernilai 1 jika ada unsigned overflow untuk low nibble, 4 bit.
Interrupt Enable Flag (IF), jika flag bernilai 1 CPU mendapatkan interrupt dari device eksternal.
Direction Flag (DF), flag ini digunakan oleh beberapa instruksi untuk memproses rantai data, jika flag bernilai 0, maka proses diselesaikan ke depan. Jika flag bernilai 1, maka proses diselesaikan ke belakang.
Ada 3 kelompok instruksi.

Kelompok pertama: ADD, SUB, CMP, AND, TEST, OR, XOR
Tipe operand yang mendukungnya register to memory, memory to register, register to register, immediate to register, dan immediate to memory.
Register: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
Memory: [BX], [BX+SI+7], variable, dan lain sebagainya.
Immediate: 5, -24, 3Fh, 10001101b, dan lain sebagainya.

Setelah operasi antar operand, hasilnya selalu disimpan di operand pertama. Instruksi CMP dan TEST berakibat hanya pada flag dan tidak menyimpan hasilnya, instruksi tersebut digunakan utnuk membuat keputusan selama eksekusi program. Instruksi-instruksi yang berpengaruh hanya pada flag: CF, ZF, SF, OF, PF, AF.
  • ADD - menambah operand ke dua ke operand pertama
  • SUB - mengurangi operand kedua dari operand yang pertama
  • CMP - mengurangi operand kedua dari operand pertama hanya flag saja
  • AND - logical AND antara semua bit dari dua operand
  • TEST - sama seperti AND tapi hanya untuk flag saja
  • OR - logical OR antara semua bit dari dua operand
  • XOR - logical XOR (exclusive OR) antara semua bit dari dua operand

Kelompok Kedua: MUL, IMUL, DIV, IDIV
Tipe operand yang mendukungnya memory to register.
Register: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
Memory: [BX], [BX+SI+7], variable, dan lain sebagainya.
Instruksi MUL dan IMUL mempengaruhi hanya flag  CF dan OF
Jika hasilnya diatas ukuran operand flag diubah menjadi bernilai 1, jika tidak 0. Untuk flag DIV dan IDIV tidak didefinisikan.
MUL - perkalian unsigned, bilangan tidak bertanda minus.
  • Jika operand-nya byte: AX = AL * operand
  • Jika operand-nya word: (DX AX) = AX * operand
IMUL - perkalian signed, bilangan bertanda minus.
  • Jika operand-nya byte: AX = AL * operand
  • Jika operand-nya word: (DX AX) = AX * operand
DIV - pembagian unsigned, bilangan tidak bertanda minus.
  • Jika operand-nya byte: AL = AX / operand dan AH = remainder (modulus)
  • Jika operand-nya word: AX = (DX AX) / operand dan DX = remainder (modulus)
IDIV - pembagian signed, bilangan bertanda minus.
  • Jika operandnya byte: AL = AX/operand dan AH = remainder (modulus)
  • Jika operandnya word: AX = (DX AX)/operand dan DX = remainder (modulus)

Kelompok ketiga: INC, DEC, NOT, NEG
Tipe operand yang mendukung memory to register.
Register: AX, BX, CX, DX, AH, AL, BL, BH, CH, CL, DH, DL, DI, SI, BP, SP.
Memory: [BX], [BX+SI+7], variabel, dan lain sebagainya.
Instruksi NOT tidak mempengaruhi flag apapun.
Instruksi INC, DEC mempengaruhi flag ZF, SF, OF, PF, dan AF.
Instruksi NEG mempengaruhi flag CF, ZF, SF, OF, PF, dan AF.