Bit Operation & Boolean Operation and or nor xor rol ror complement
Digital logic | OS | คำสั่งดอส | Batch | Debug | Assembly | GWBasic | Docker |
Bit Operation & Boolean Operations
ได้แก่ and or xor not และ shr shl rol ror rcl rcr
  1. shl (Shift Left) ทำหน้าที่ เลื่อนไปทางซ้าย (shl 0111,1 = 1110)
  2. shr (Shift Right) ทำหน้าที่ เลื่อนไปทางขวา (shr 0111,1 = 0011)
  3. rol (Rotate Left) ทำหน้าที่ เลื่อนบิทไปทางซ้าย ไม่เก็บ Carry Flag เช่น 01110111 => 11101110
  4. ror (Rotate Right) ทำหน้าที่ เลื่อนบิทไปทางขวา ไม่เก็บ Carry Flag เช่น 01110111 => 10111011
  5. rcl (Rotate through Carry Left) ทำหน้าที่ เลื่อนบิทไปทางซ้าย และเก็บ Carry Flag เป็นตัวที่ 9 (ตัวทด)
  6. rcr (Rotate through Carry Right) ทำหน้าที่ เลื่อนบิทไปทางขวา และเก็บ Carry Flag เป็นตัวที่ 9 (ตัวทด)
  7. sal (Shift Arithmetic Left) ทำหน้าที่ เลื่อนไปทางซ้ายแบบคิดเครื่องหมาย
  8. sar (Shift Arithmetic Right) ทำหน้าที่ เลื่อนไปทางขวาแบบคิดเครื่องหมาย
  9. add ทำหน้าที่ เพิ่มค่า แต่อ้างอิงกับเลขฐาน 10 (41 add 2 = 43)
  10. and ทำหน้าที่ เป็นจริงเมื่อเป็นจริงทั้งคู่ (0100 0001 and 0100 0010 = 0100 0000)
  11. or ทำหน้าที่ เป็นจริงเมื่อตัวใดตัวหนึ่งเป็นจริง (0100 0001 or 0100 0010 = 0100 0011)
  12. xor ทำหน้าที่ เป็นจริงเมื่อต่างกัน เหมือนกันเป็นเท็จ (0100 0011 or 0000 0010 = 0100 0001)
  13. not ทำหน้าที่ เปลี่ยนจริงเป็นเท็จ และเท็จเป็นจริง (not 0100 0011 = 1011 1100)

สำหรับการแสดงผล จะใช้ Interrupt 21 บริการ AH = 02 ร่วมกับ DL นำ Ascii ฐาน 16 ไปแสดงบนจอภาพ 1 ตัวอักษร
เช่น
mov ah,02
mov dl,41
int 21
int 20

เป็นความจำเป็นที่ต้องเรียนเลขฐาน 2 เพราะในหลาย ๆ เรื่องต้องใช้ เช่น การเขียนโปรแกรม ระบบเครือข่าย และ ระบบความปลอดภัย เป็นต้น เช่น การหาคำตอบว่า 5 and 3 เป็นเท่าใด (คำตอบคือ 7) ก็ต้องใช้เลขฐาน 2 ก่อนเรียนเรื่อง Boolean Operations หรือคำสั่งกระทำการทางลอจิก (Logic Operations) ก็ต้องเข้าใจเลขฐาน 2 และ ฐาน 16 ให้ดี
101 and 011 = 111
EX 1 :: ? คือ การแสดงคำสั่งที่ใช้งานได้ของ debug
    C:\>debug -? assemble A [address] compare C range address dump D [range] enter E address [list] fill F range list go G [=address] [addresses] hex H value1 value2 input I port load L [address] [drive] [firstsector] [number] move M range address name N [pathname] [arglist] output O port byte proceed P [=address] [number] quit Q register R [register] search S range list trace T [=address] [value] unassemble U [range] write W [address] [drive] [firstsector] [number] allocate expanded memory XA [#pages] deallocate expanded memory XD [handle] map expanded memory pages XM [Lpage] [Ppage] [handle] display expanded memory status XS -

EX 2 :: ตัวอย่างการใช้ SHL
- SHL คือย้ายบิท เข้าไปทางซ้าย
- DFFD = 1101 1111 1111 1101
- BFFA = 1011 1111 1111 1010
    C:\>debug -a 100 0B24:0100 mov dx,dffd 0B24:0103 shl dx,1 0B24:0105 -r AX=0000 BX=0000 CX=0000 DX=DFFD SP=FFEE BP=0000 SI=0000 DI=01B8 DS=0B24 ES=0B24 SS=0B24 CS=0B24 IP=0103 OV UP EI PL NZ NA PE CY 0B24:0103 D1E2 SHL DX,1 -t =cs:100 2 AX=0000 BX=0000 CX=0000 DX=DFFD SP=FFEE BP=0000 SI=0000 DI=01B8 DS=0B24 ES=0B24 SS=0B24 CS=0B24 IP=0103 OV UP EI PL NZ NA PE CY 0B24:0103 D1E2 SHL DX,1 AX=0000 BX=0000 CX=0000 DX=BFFA SP=FFEE BP=0000 SI=0000 DI=01B8 DS=0B24 ES=0B24 SS=0B24 CS=0B24 IP=0105 NV UP EI NG NZ NA PE CY 0B24:0105 D1E2 SHL DX,1 -

EX 3 :: ดูข้อมูลใน Register จะใช้ t หรือ r ก็ได้
    C:\>debug -t AX=0000 BX=0000 CX=0000 DX=0011 SP=FFEE BP=0000 SI=0000 DI=0000 DS=0AE8 ES=0AE8 SS=0AE8 CS=0AE8 IP=0102 NV UP EI PL NZ NA PO NC -

EX 4 :: แสดงตัวอักษร แล้วเลิกการทำงาน
    C:\>debug -a 100 0AE8:0100 mov ah,02 0AE8:0102 mov dl,41 0AE8:0104 int 21 0AE8:0106 int 20 -g A Program terminated normally -

EX 5 :: แก้ตำแหน่ง 106 โดยใช้ or
0100 0001 or 0100 0010 = 0100 0011
    C:\>debug -a 100 0AE8:0100 mov ah,02 0AE8:0102 mov dl,41 0AE8:0104 int 21 0AE8:0106 int 20 -g A Program terminated normally -a 106 0AE8:0106 or dl,42 0AE8:0109 int 21 0AE8:010B int 20 0AE8:010D -g AC Program terminated normally -

EX 6 :: คำสั่ง add และสร้างแฟ้ม ทำให้ค่าของ 41 เพิ่มอีก 2 เป็น 43
    C:\>debug -n x.com -a 0AE8:0100 mov ah,02 0AE8:0102 mov dl,41 0AE8:0104 int 21 0AE8:0106 add dl,2 0AE8:0109 int 21 0AE8:010B int 20 0AE8:010D -rcx CX 0000 :d -w Writing 0000D bytes -q C:\>x AC C:\>

EX 7 :: คำสั่ง ror ย้าย bit ไปทางขวา
before 0111 0111=77=w, after 1011 1011=BB
    -u 100 10a 0AE8:0100 B277 MOV DL,77 0AE8:0102 B402 MOV AH,02 0AE8:0104 CD21 INT 21 0AE8:0106 D0CA ROR DL,1 0AE8:0108 CD21 INT 21 0AE8:010A CD20 INT 20 -g w? Program terminated normally -

EX 8 :: คำสั่ง rcl ย้าย bit ไปทางงซ้าย แต่มีตัวทด(Carry Flag) มารับ (ต.ย.นี้ไม่เห็นความแตกต่าง)
before 00110001=31=1, after 01100010=62=b, cf=0
    -u 100 10A 0AE8:0100 B231 MOV DL,31 0AE8:0102 B402 MOV AH,02 0AE8:0104 CD21 INT 21 0AE8:0106 D0CA RCL DL,1 0AE8:0108 CD21 INT 21 0AE8:010A CD20 INT 20 -g 1b Program terminated normally -

EX 9 :: คำสั่ง rcr ย้าย bit ไปทางขวา แต่มีตัวทด(Carry Flag) มารับ
106 : before 01110001=71=q, after 00111000=38=8, cf=1
10A : before 00111000=38=8, after 10011100=9C=?, cf=0
10C : before 10011100=9C=?, after 01001110=4E=N, cf=0
    -u 100 0AE8:0100 B271 MOV DL,71 0AE8:0102 B402 MOV AH,02 0AE8:0104 CD21 INT 21 0AE8:0106 D0DA RCR DL,1 0AE8:0108 CD21 INT 21 0AE8:010A D0DA RCR DL,1 0AE8:010C D0DA RCR DL,1 0AE8:010E CD21 INT 21 0AE8:0110 CD20 INT 20 -g q8N Program terminated normally -

EX 10 :: คำสั่ง rcl และ rcr ใช้ย้าย bit แบบมีตัวทด(Carry Flag)
106 : rcr dl,1 : before 0111_0111=77=w, cf=0, after 0011_1011=3B, cf=1
10A : rcr dl,1 : before 0011_1011=3B=?, cf=1, after 1001_1101=9D, cf=1
10E : rcr dl,1 : before 1001_1101=9D=w, cf=1, after 1100_1110=CE, cf=1
112 : rcl dl,1 : before 1100_1110=CE, cf=1, after 1001_1101=9D=w, cf=1
116 : rcl dl,1 : before 1001_1101=9D=w, cf=1, after 0011_1011=3B=?, cf=1
    C:\>debug -a 100 0AE8:0100 mov dl,77 0AE8:0102 mov ah,02 0AE8:0104 int 21 0AE8:0106 rcr dl,1 0AE8:0108 int 21 0AE8:010A rcr dl,1 0AE8:010C int 21 0AE8:010E rcr dl,1 0AE8:0110 int 21 0AE8:0112 rcl dl,1 0AE8:0114 int 21 0AE8:0116 rcl dl,1 0AE8:0118 int 21 0AE8:011A int 20 0AE8:011C -g w;???; -

OpCode of Intel Assembly 80x86
Mnemonics

From :http://www.jegerlehner.ch/intel/opcode.html
TRANSFER
Name Comment Syntax
MOV Move (copy) MOV Dest,Source
XCHG Exchange XCHG Op1,Op2
STC Set Carry STC
CLC Clear Carry CLC
CMC Complement Carry CMC
STD Set Direction STD
CLD Clear Direction CLD
STI Set Interrupt STI
CLI Clear Interrupt CLI
PUSH Push onto stack PUSH Source
PUSHF Push flags PUSHF
PUSHA Push all general registers PUSHA
POP Pop from stack POP Dest
POPF Pop flags POPF
POPA Pop all general registers POPA
CBW Convert byte to word CBW
CWD Convert word to double CWD
CWDE Conv word extended double CWDE
IN Input IN Dest, Port
OUT Output OUT Port, Source

ARITHMETIC
Name Comment Syntax
ADD Add ADD Dest,Source
ADC Add with Carry ADC Dest,Source
SUB Subtract SUB Dest,Source
SBB Subtract with borrow SBB Dest,Source
DIV Divide (unsigned) DIV Op
IDIV Signed Integer Divide IDIV Op
MUL Multiply (unsigned) MUL Op
IMUL Signed Integer Multiply IMUL Op
INC Increment INC Op
DEC Decrement DEC Op
CMP Compare CMP Op1,Op2
SAL Shift arithmetic left SAL Op,Quantity
SAR Shift arithmetic right SAR Op,Quantity
RCL Rotate left through Carry RCL Op,Quantity
RCR Rotate right through Carry RCR Op,Quantity
ROL Rotate left ROL Op,Quantity
ROR Rotate right ROR Op,Quantity

LOGIC
Name Comment Syntax
NEG Negate (two-complement) NEG Op
NOT Invert each bit NOT Op
AND Logical and AND Dest,Source
OR Logical or OR Dest,Source
XOR Logical exclusive or XOR Dest,Source
SHL Shift logical left SHL Op,Quantity
SHR Shift logical right SHR Op,Quantity

MISCELLANEOUS
Name Comment Syntax
NOP No operation NOP
LEA Load effective adress LEA Dest,Source
INT Interrupt INT Nr

JUMPS (general)
Name Comment Syntax
CALL Call subroutine CALL Proc
JMP Jump JMP Dest
JE Jump if Equal JE Dest
JZ Jump if Zero JZ Dest
JCXZ Jump if CX Zero JCXZ Dest
JP Jump if Parity (Parity Even) JP Dest
JPE Jump if Parity Even JPE Dest
RET Return from subroutine RET
JNE Jump if not Equal JNE Dest
JNZ Jump if not Zero JNZ Dest
JECXZ Jump if ECX Zero JECXZ Dest
JNP Jump if no Parity (Parity Odd) JNP Dest
JPO Jump if Parity Odd JPO Dest

JUMPS unsigned (Cardinal)
JA Jump if Above JA Dest
JAE Jump if Above or Equal JAE Dest
JB Jump if Below JB Dest
JBE Jump if Below or Equal JBE Dest
JNA Jump if not Above JNA Dest
JNAE Jump if not Above or Equal JNAE Dest
JNB Jump if not Below JNB Dest
JNBE Jump if not Below or Equal JNBE Dest
JC Jump if Carry JC Dest
JNC Jump if no Carry JNC Dest

JUMPS signed (Integer)
JG Jump if Greater JG Dest
JGE Jump if Greater or Equal JGE Dest
JL Jump if Less JL Dest
JLE Jump if Less or Equal JLE Dest
JNG Jump if not Greater JNG Dest
JNGE Jump if not Greater or Equal JNGE Dest
JNL Jump if not Less JNL Dest
JNLE Jump if not Less or Equal JNLE Dest
JO Jump if Overflow JO Dest
JNO Jump if no Overflow JNO Dest
JS Jump if Sign (= negative) JS Dest
JNS Jump if no Sign (= positive) JNS Dest