540 likes | 660 Vues
This guide provides an in-depth overview of fundamental assembly language instructions including MOV, XCHG, LEA, ADD/ADC, SUB/SBB, and more. Each command's purpose, format, and examples demonstrate usage for moving data between registers and memory, arithmetic operations, and effective address calculation. Readers will understand constraints around instruction use, such as memory limitations and how values can be swapped or calculated. Whether for learning or practical applications, this guide serves as a useful resource for mastering assembly language programming.
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