Arithmetic Instruction Suthida Chaichomchuen std@kmitnb.ac.th
Arithmetic Instruction เป็นคำสั่งที่ใช้ในการคำนวณทางคณิตศาสตร์ เช่น บวก ลบ คูณ หาร กับเลขฐานสองหรือเลขฐานสิบ
ค่าที่ใช้ในการคำนวณ เลขฐานสอง unsigned signed เลขฐานสิบ packed unpacked
เลขฐานสอง มีความยาว 8/16 บิต Unsigned : ทุกบิตจะแทนค่าของข้อมูล 8 บิต : 0 ถึง 255 16 บิต : 0 ถึง 65535 Signed : บิตสูงสุดจะบอกเครื่องหมาย 8 บิต : -128 ถึง 127 16 บิต : -32768 ถึง 32767
เลขฐานสิบ เก็บค่าเป็นไบต์ Packed (00-99) Unpacked (0-9) บิต 0-3 เก็บค่าในหลักที่ต่ำ (BCD) บิต 4-7 เก็บค่าในหลักที่สูง (BCD) Unpacked (0-9) บิต 0-3 เก็บค่า BCD 1 ค่า บิต 4-7 เก็บค่า [0:คูณ,หาร] [?:บวก,ลบ]
Addition Instruction บวก operand 8/16 บิต ADD ADC : ADD with Carry destination = destination+source ADC : ADD with Carry destination = destination+source+carry
ADD & ADC [Label:] ADD/ADC register, register [Label:] ADD/ADC memory, register [Label:] ADD/ADC register, memory [Label:] ADD/ADC register, immediate [Label:] ADD/ADC memory, immediate
ADD & ADC ADD AL, BL ADD AL, BYTE ADD BYTE, AL ADD BL, 10H ADD BYTE, 25H
AAA : ASCII Adjust After Addition ปรับค่าของผลลัพธ์จากการบวกเลขฐานสิบ โดยที่ผลลัพธ์ที่จะปรับค่าต้องอยู่ใน AL AAA จะเปลี่ยนค่าใน AL เป็น unpacked decimal digit โดยจะพิจารณาจาก ถ้า 4 บิตล่างของ AL มีค่า 0-9 จะทำให้ 4 บิตบนของ AL มีค่า 0 แฟลก AF และ CF เป็น 0 ด้วย
AAA พิจารณาจาก (ต่อ) ถ้า 4 บิตล่างของ AL มีค่ามากกว่า 9 หรือ AF มีค่า 1 จะบวก 6 ให้กับ AL บวก 1 กับ AH SET AF และ CF เป็น 1 4 บิตบนของ AL มีค่าเป็น 0
DAA : Decimal Adjustment After Addition การทำงานคล้าย AAA DAA จะเปลี่ยนค่าใน AL เป็น packed decimal digit 2 ค่า โดยจะพิจารณาจากตัวเลข 2 ตัว ถ้า 4 บิตล่างของ AL มีค่ามากกว่า 9 หรือ AF มีค่า 1 จะบวกค่า 6 กับ AL และให้ AF เป็น 1
DAA พิจารณา (ต่อ) ถ้า 4 บิตบนของ AL มีค่ามากกว่า 9 หรือ AF มีค่า 1
DAA AL=‘5’ BL=‘9’ ADD AL, BL AAA AL=‘59’ BL=‘35’ DAA
Increment Instruction บวกค่า 1 ให้กับรีจิสเตอร์หรือหน่วยความจำ [label:] INC register/memory Example INC CX INC AL INC MEM_BYTE INC MEM_WORD [BX]
Subtraction Instruction ลบค่า operand 8/16 บิต CF ทำหน้าที่เหมือนตัวยืม SUB destination = destination-source SBB : Subtract with Borrow destination = destination-source-carry
SUB & SBB SUB AX,BX SUB AX,WORD SUB WORD,AX SUB BX,1000H SUB WORD,256H
SUB & SBB ถ้าต้องการลบค่า 32 บิต ใช้คำสั่งดังนี้ กำหนดตัวตั้งใน BX, AX ตัวลบอยู่ใน DX, CX SUB AX, CX SBB BX, DX
AAS : ASCII Adjust for Subtraction ปรับค่าของผลลัพธ์จากการลบเลขฐานสิบ โดยที่ผลลัพธ์ที่จะปรับค่าต้องอยู่ใน AL AAS จะเปลี่ยนค่าใน AL เป็น unpacked decimal digit โดยจะพิจารณาจาก ถ้า 4 บิตล่างของ AL มีค่า 0-9 จะทำให้ 4 บิตบนของ AL มีค่า 0 แฟลก AF และ CF เป็น 0 ด้วย
AAS พิจารณาจาก (ต่อ) ถ้า 4 บิตล่างของ AL มีค่ามากกว่า 9 หรือ AF มีค่า 1 จะลบ 6 จาก AL ลบ 1 จาก AH SET AF และ CF เป็น 1 4 บิตบนของ AL มีค่าเป็น 0
DAS : Decimal Adjustment for Subtraction การทำงานคล้าย AAS DAS จะเปลี่ยนค่าใน AL เป็น packed decimal digit 2 ค่า โดยจะพิจารณาจากตัวเลข 2 ตัว ถ้า 4 บิตล่างของ AL มีค่ามากกว่า 9 หรือ AF มีค่า 1 จะลบค่า 6 ออกจาก AL และให้ AF เป็น 1
DAS พิจารณา (ต่อ) ถ้า 4 บิตบนของ AL มีค่ามากกว่า 9 หรือ AF มีค่า 1
AAS & DAS AL=‘7’ BL=‘4’ SUB AL, BL AAS AL=‘4’ CL=‘7’ SUB AL, CL
AAS & DAS AL=‘86’ BH=‘57’ SUB AL, BH DAS AL=‘45’ CH=‘63’ SUB AL, CH
Decrement Instruction ลบค่า 1 ให้กับรีจิสเตอร์หรือหน่วยความจำ [label:] DEC register/memory Example DEC CX DEC AL DEC MEM_BYTE DEC MEM_WORD [BX]
Negate Instruction เป็นคำสั่งในการหาค่า 2’s Complement [label:] NEG register/memory Example NEG CL NEG BX NEG MEM_BYTE NEG MEM_WORD [BX]
Compare Instruction CMP : Compare Destination to Source ลบค่า source ออกจาก destination แต่ไม่ได้เก็บค่าไว้ มีผลต่อแฟลก AF, CF, OF, PF, SF และ ZF ใช้ในการตรวจสอบค่าแฟลก เพื่อตัดสินใจในการย้ายคำสั่งการทำงานไปยังจุดต่าง ๆ
Source < Destination x x 0 0 Source = Destination x x 1 0 Compare Instruction Unsigned Operands Condition OF SF ZF CF Source < Destination x x 0 0 Source = Destination x x 1 0 Source > Destination x x 0 1
Source < Destination 0/1 0 0 x Source = Destination 0 0 1 x Compare Instruction Signed Operands Condition OF SF ZF CF Source < Destination 0/1 0 0 x Source = Destination 0 0 1 x Source > Destination 0/1 1 0 x
CMP [label:] CMP register/memory, register/memory/ immediate Example CMP DX, 00
Multiplication Instruction MUL : Unsigned Multiplication IMUL : Signed Multiplication ใช้ AL สำหรับการคูณไบต์ ผลลัพธ์เก็บไว้ที่ AH และ AL ใช้ AX สำหรับการคูณเป็นเวิร์ด ผลลัพธ์เก็บไว้ที่ DX และ AX ผลลัพธ์จะมีความยาวเป็น 2 เท่า
MUL & IMUL [label:] MUL/IMUL register/memory MUL ถ้าครึ่งบนของผลลัพธ์เป็น 0 CF และ OF จะมีค่าเป็น 0 IMUL : Signed Multiplication ถ้าครึ่งบนของผลลัพธ์เป็น sign-extension
MUL & IMUL Example MUL BX MUL MEM_BYTE IMUL DL IMUL MEM_WORD
MUL & IMUL Example : คูณเลขที่มีเครื่องหมาย ระหว่างเลข 8 บิต กับ 16 บิต MOV AX, MULTIPLIER MOV CL, MULTIPLICAND MOV CH,0 IMUL CX
MUL & IMUL Example : คูณเลขที่ไม่มีเครื่องหมาย ระหว่างเลข 8 บิต กับ 16 บิต MOV AX, MULCAND_16 MOV CL, MULTIPIER_8 MOV CH, 0 MUL CX
AAM : ASCII Adjust After Multiplication ปรับค่าการคูณของเลข 8 บิตเป็น unpacked BCD 2 ค่า AAM จะสมมติให้ผลลัพธ์อยู่ใน AH และ AL ค่า unpacked BCD จะถูกเก็บใน AH และ AL ตัวตั้งและตัวคูณต้องเป็น unpacked BCD ด้วย
AAM ขั้นตอนการปรับค่าของคำสั่ง AAM หาร AL ด้วย 10 (0AH)
AAM Example AL=‘5’ BH=‘9’ MUL BH AAM
Division Instruction DIV : Unsigned Division IDIV : Signed Division [label:] DIV/IDIV register/memory
DIV & IDIV การหารเลข 8 บิต Source เป็นตัวหาร AL และ AH เก็บค่าตัวตั้ง ผลลัพธ์ จำนวนเต็มเก็บไว้ที่ AL เศษเก็บไว้ที่ AH
DIV & IDIV การหารเลข 16 บิต Source เป็นตัวหาร DX และ AX เก็บค่าตัวตั้ง ผลลัพธ์ จำนวนเต็มเก็บไว้ที่ AX เศษเก็บไว้ที่ DX
DIV & IDIV ถ้าผลลัพธ์จากการหารได้ค่าจำนวนเต็มที่ใหญ่กว่าที่ AL หรือ AX จะเก็บได้ จะเกิดการ Interrupt ชนิด 0 โดย DOS จะแสดงข้อความว่า “Divide Overflow”
DIV & IDIV Example DIV BX DIV MEM_BYTE IDIV DL IDIV MEM_WORD
DIV & IDIV Example : การหารเลขที่มีเครื่องหมาย ระหว่างเลข 8 บิตกับ 16 บิต AX=03ABH=939 BL=D3H=-45 IDIV BL
DIV & IDIV Example : การหารเลขที่ไม่มีเครื่องหมาย ระหว่างเลข 8 บิตกับ 16 บิต AX=37D7H=14295 BL=97H=151 DIV BL
AAD : ASCII Adjust before Division ปรับค่าของตัวตั้งในการหารให้เป็นเลขฐานสอง คูณส่วนบนของตัวตั้ง (AH) ด้วย 10 บวกผลลัพธ์กับส่วนล่างของตัวตั้ง (AL) ทำให้ค่าใน AH เป็น 0 คำสั่ง AAD ต้องถูกเรียกใช้ก่อนการหาร
AAD Example AX=0000 0011 0000 0111 CL=0000 0101 AAD DIV CL
Extending values in a Registers CBW : Convert Byte to Word เป็นคำสั่งที่ลอกค่าของบิต 7 ใน AL ไปใส่ใน AH ทำให้สามารถบวกค่า 8 บิตกับ 16 บิต หรือ ลบค่า 16 บิตจาก 8 บิต
Extending values in a Registers CWD : Convert Word to Doubleword เป็นคำสั่งที่ลอกค่าของบิต 15 ใน AX ไปใส่ใน DX ทำให้สามารถหารเลข 16 บิต ด้วยเลข 16 บิตได้
CBW & CWD Example CBW ADD AX, BX IMUL BX CWD IDIV BX
CBW & CWD Extending the sign(0) in the AL through the AH adds 20H to the AX. AH AL . . . xx 60H CBW 00 60 ADD AX, 20H 00 80
CBW & CWD Extending a 1 word signed value to a doubleword by duplication the sign bit of AX through the DX. MOV AX, WORD1 CWD