540 likes | 657 Views
Basic I nstructions. SCC : Suthida Chaichomchuen std@kmitnb.ac.th. Basic Instructions. MOV XCHG LEA ADD/ADC SUB/SBB MUL/IMUL DIV/IDIV CMP INC/DEC NEG. MOV ( move ).
E N D
Basic Instructions SCC : Suthida Chaichomchuen std@kmitnb.ac.th
Basic Instructions • MOV • XCHG • LEA • ADD/ADC • SUB/SBB • MUL/IMUL • DIV/IDIV • CMP • INC/DEC • NEG
MOV (move) • เป็นการคัดลอกข้อมูลขนาดไบต์หรือเวิร์ดจากต้นทางไปยังปลายทางโดยที่ต้นทางและปลายทางอาจจะเป็น รีจิสเตอร์กับรีจิสเตอร์ หรือรีจิสเตอร์กับตำแหน่งของหน่วยความจำ หรือค่าคงที่ไปยังรีจิสเตอร์หรือหน่วยความจำ
MOV : Format • [label:] MOV destination, source • [label:]MOV register, register • [label:]MOV register, memory • [label:]MOV register, immediate • [label:]MOV memory, register • [label:]MOV memory, immediate
MOV : Example • MOV AX, Table • MOV Table, AX • MOV ES:[BX], AX • MOV DS, AX • MOV BL, AL • MOV CL, -30 • MOV Dest, 25H
MOV : Constraint • ไม่สามารถย้ายข้อมูลระหว่างหน่วยความจำได้ • ต้องใช้รีจิสเตอร์เป็นตัวกลางในการย้ายข้อมูลระหว่างหน่วยความจำ • เช่น ต้องการย้ายข้อมูลจาก Pounds ไปยัง Weight โดยผ่านรีจิสเตอร์ AX MOV AX, Pounds MOV Weight, AX
MOV : Constraint • ไม่สามารถนำค่า immediate เช่นค่า offset ใส่ให้ segment register ได้โดยตรง • ต้องใช้รีจิสเตอร์ AX เป็นตัวกลางผ่านค่า offset ไปยัง segment register MOV AX, @DATA MOV DS, AX • รีจิสเตอร์ CS ไม่สามารถใช้เป็น destination ของคำสั่ง MOV ได้
XCHG (exchange) • คำสั่ง XCHG จะสลับค่าเป็นไบต์หรือเวิร์ดระหว่าง operand ที่เป็น source และ destination • สามารถสลับค่าระหว่างรีจิสเตอร์ 2 ตัว หรือระหว่างรีจิสเตอร์กับค่าในหน่วยความจำ • Segment Register ไม่สามารถนำมาใช้เป็น operand ได้
XCHG : Format • [label:] XCHG destination, source • [label:] XCHG register, register • [label:] XCHG register, memory • [label:] XCHG memory, register
XCHG : Example • XCHG AX, BX • XCHG AL, BH • XCHG DL, Byte • XCHG Word, DX
LEA (load effective address) • คำสั่ง LEA จะนำค่าออฟเซตของ Operand ในหน่วยความจำไปใส่ไว้ในรีจิสเตอร์ 16 บิต • รูปแบบคำสั่ง [label:] LEA register16, memory16
LEA : Example • นำค่าออฟเซตของ Table ไปใส่ใน BX Table DB 10,20,30,40,50,60,70 LEA BX, Table
Addition Instruction • บวก operand 8/16 บิต • ADD • destination = destination+source • ADC : ADD with Carry • destination = destination+source+carry
ADD & ADC : Format • [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 : Example • ADD AX, BX • ADD AL, Byte • ADD Word, AX • ADD BL, 10H • ADD Byte, 25H
ADC : Example • ADC AX, BX • ADC AL, Byte • ADCWord, AX • ADC BL, 10H • ADC Byte, 25H
Subtraction Instruction • ลบค่า operand 8/16 บิต • CF ทำหน้าที่เหมือนตัวยืม • SUB • destination = destination-source • SBB : Subtract with Borrow • destination = destination-source-carry
SUB & SBB: Format • [Label:] SUB/SBB register, register • [Label:] SUB/SBB memory, register • [Label:] SUB/SBB register, memory • [Label:] SUB/SBB register, immediate • [Label:] SUB/SBB memory, immediate
SUB : Example • SUB AX, BX • SUB AX, Word • SUB Word, AX • SUB BX, 1000H • SUB Word, 256H
SBB : Example • SBB AX, BX • SBB AX, Word • SBB Word, AX • SBB BX, 1000H • SBB Word, 256H
SUB & SBB : 32 bit • ถ้าต้องการลบค่า 32 บิต ใช้คำสั่งดังนี้ • กำหนดตัวตั้งใน BX, AX • ตัวลบอยู่ใน DX, CX • SUB AX, CX • SBB BX, DX
Multiplication Instruction • เป็นคำสั่งที่ใช้ในการคูณเลข 8 บิตและ 16 บิต • ผลลัพธ์ที่ได้จากการคูณจะมีขนาดเพิ่มขึ้นเป็น 2 เท่า • มี 2 แบบคือ • MUL : Unsigned Multiplication • IMUL : Signed Multiplication
Multiplication : 8 bit • การคูณเลข 8 บิต • ตัวตั้งเก็บไว้ที่รีจิสเตอร์ AL • ตัวคูณเก็บไว้ที่รีจิสเตอร์หรือหน่วยความจำขนาด 8 บิต • ผลลัพธ์จะมีขนาด 16 บิต เก็บอยู่ในรีจิสเตอร์ AX
Multiplication : 16 bit • การคูณเลข 16 บิต • ตัวตั้งเก็บไว้ที่รีจิสเตอร์ AX • ตัวคูณเก็บไว้ที่รีจิสเตอร์หรือหน่วยความจำขนาด 16 บิต • ผลลัพธ์จะมีขนาด 32 บิต เก็บอยู่ในรีจิสเตอร์ DX และ AX • DX เก็บผลลัพธ์ 16 บิตบน • AX เก็บผลลัพธ์ 16 บิตล่าง
MUL : Format • [label:] MUL register/memory • เป็นการคูณแบบไม่คิดเครื่องหมาย • ถ้าครึ่งบนของผลลัพธ์การคูณเป็น 0 • CF และ OF จะมีค่าเป็น 0
IMUL : Format • [label:] IMUL register/memory • เป็นการคูณแบบคิดเครื่องหมาย • ถ้าครึ่งบนของผลลัพธ์การคูณเป็น sign-extension • CF และ OF จะมีค่าเป็น 0
MUL & IMUL : Example • MUL BX • MUL Byte • IMUL DL • IMUL Word
MUL : Example • คูณเลขที่ไม่มีเครื่องหมาย ระหว่างเลข 8 บิต กับ 16 บิต MOV AX, Multiplicand ; AX = ตัวตั้ง MOV CL, Multiplier ;CL = ตัวคูณ MOV CH, 0 MUL CX; AX = AX * CX
IMUL : Example • คูณเลขที่มีเครื่องหมาย ระหว่างเลข 8 บิต กับ 16 บิต MOV AL, Multiplicand ; AL = เลข 8 บิต CBW ; ขยายเป็น 16 บิต MOV CX, Multiplier ;CX = เลข 16 บิต IMUL CX; AX = AX * CX
Division Instruction • เป็นคำสั่งที่ใช้ในการหารค่าตัวเลขด้วยเลข 8 บิตและ 16 บิต • มี 2 แบบคือ • DIV : Unsigned Division • IDIV : Signed Division • รูปแบบ • [label:] DIV/IDIV register/memory
Division : by 8 bit • การหารเลข 16 บิต ด้วยเลข 8 บิต • ตัวตั้งขนาด 16 บิตเก็บไว้ที่รีจิสเตอร์ AX • ตัวหารขนาด 8 บิตเก็บไว้ที่รีจิสเตอร์/หน่วยความจำ • ผลลัพธ์ • จำนวนเต็มเก็บไว้ที่ AL • เศษเก็บไว้ที่ AH
Division : by 16 bit • การหารเลข 32 บิตด้วย 16 บิต • ตัวตั้งขนาด 32 บิตเก็บในรีจิสเตอร์ DX และ AX • DX เก็บไบต์สูง • AX เก็บไบต์ต่ำ • ตัวหารขนาด 16 บิตเก็บในรีจิสเตอร์/หน่วยความจำ • ผลลัพธ์ • จำนวนเต็มเก็บไว้ที่ AX • เศษเก็บไว้ที่ DX
Division :Overflow • ถ้าผลลัพธ์จากการหารได้ค่าจำนวนเต็มที่ใหญ่กว่าที่ AL หรือ AX จะเก็บได้ จะเกิดการ Interrupt ชนิด 0 โดย DOS จะแสดงข้อความว่า “Divide Overflow”
DIV & IDIV : Example • DIV CL • DIV BX • DIV byte • DIV word • IDIV DL • IDIV CX • IDIV byte • IDIV word
DIV : Example • การหารเลขที่ไม่มีเครื่องหมายขนาด 16 บิตด้วยเลข 8 บิต • MOV AX, 037D7H ; 14295 • MOV BL, 097H ; 151 • DIV BL ; 14295/151
IDIV : Example • การหารเลขที่มีเครื่องหมายขนาด 16 บิตด้วยเลข 8 บิต • MOV AX, 03ABH ; 939 • MOV BL, 0D3H ; -45 • IDIV BL ; 939/-45
CMP (compare) • เป็นคำสั่งที่ใช้เปรียบเทียบค่า 2 ค่า • ใช้หลักการลบค่า source ออกจาก destination แต่ไม่ได้เก็บค่าผลลัพธ์ไว้ • มีผลต่อแฟลก AF, CF, OF, PF, SF และ ZF • ใช้ในการตรวจสอบค่าแฟลก เพื่อตัดสินใจในการย้ายคำสั่งการทำงานไปยังจุดต่าง ๆ
CMP: Format • [label:] CMP destination, source • [label:] CMP register, register • [label:] CMP register, memory • [label:] CMP register, immediate • [label:] CMP memory, register • [label:] CMP memory,immediate
CMP: Example • CMP AX, BX • CMP CL, count • CMP CX, 0 • CMP number,AL • CMP empty,0
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 CMP : Unsigned
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 : Signed
INC (increment) • เพิ่มค่าให้กับรีจิสเตอร์/หน่วยความจำ 1 ค่า • รูปแบบ • [label:] INC register/memory • Example • INC CX • INC AL • INC byte • INC word
DEC (decrement) • ลดค่าในรีจิสเตอร์/หน่วยความจำ 1 ค่า • รูปแบบ • [label:] DEC register/memory • Example • DEC CX • DEC AL • DEC byte • DEC word
NEG (negate) • เป็นคำสั่งในการหาค่า 2’s Complement • รูปแบบ • [label:] NEG register/memory • Example • NEG CL • NEG BX • NEG byte • NEG word
การแปลง operator = • B = A • MOV AX, A • MOV B, AX • var1 = var2 • MOV AX, var2 • MOV var1, AX
การแปลง operator + • X = Y + Z • MOV AX, Y • ADD AX, Z • MOV X, AX
การแปลง operator - • X = Y - Z • MOV AX, Y • SUB AX, Z • MOV X, AX
การแปลง operator * • X = Y * Z • MOV AL, Y • MUL Z • MOV X, AX
การแปลง operator div (unsigned) • X = Y div Z • MOV AX, Y • MOV DX, 0 • DIV Z • MOV X, AX
การแปลง operator div (signed) • X = Y div Z • MOV AX, Y • CWD • IDIV Z • MOV X, AX