Control Transfer Instructions Suthida Chaichomchuen std@kmitnb.ac.th
Types of Addresses Short : -128 to 127 bytes Near : -32,768 to 32,767 bytes Far : over 32K
Rules on distances for operations Short Near Far -128 to 127 -32,768 to 32,767 Over 32K or in Instructions same segment same segment another segment JMP yes yes yes Jnnn yes yes(80386+) yes LOOP yes no no CALL N/A yes yes
Instruction Labels ใช้กับ JMP, Jnnn, LOOP ตั้งตามหลักการการตั้งชื่อ ต้องปิดท้ายด้วยเครื่องหมาย : (colon) ตัวอย่างเช่น P10: INC CX
JMP Instruction เปลี่ยนแปลงลำดับการทำงานจากจุดหนึ่งไปยังอีกจุดหนึ่งโดยไม่มีเงื่อนไข รูปแบบ [label:] JMP short, near, or far address
JMP : Short & Near Short : label within -128 to +127 bytes assembler generate 2 bytes 1 byte for operation [EB] 1 byte for operand [ค่า offset ที่จะนำไปบวกกับค่าของ IP จำกัดที่ 00H-FFH]
JMP : Short & Near Near : label within 32K assembler generate 1 byte for operation [E9] 2 bytes for operand (8086/80286) or 4 bytes (80386 and later)
JMP : Forward & Backward assembler ยังไม่ generate code เพราะไม่รู้ว่าจะเป็นแบบใด (short / near) JMP P10 . . . P10:
JMP : Forward & Backward Backward within -128 bytes assembler generate code 2 bytes P10: . . . JMP P10
Using the JMP Instruction MOV AX,01 MOV BX,01 MOV CX,01 A20: ADD AX,01 ADD BX,AX SHL CX,1 JMP A20
LOOP Instruction คำสั่งควบคุมการทำงานที่ซ้ำกัน เป็นคำสั่งควบคุมที่มีเงื่อนไข ใช้ CX เป็นตัวนับการทำงานภายในลูป CX ถูกลดค่าทีละ 1 โดยอัตโนมัติเมื่อคำสั่งถูก execute
LOOP Instruction รูปแบบ [label:] LOOP short-address
Using the LOOP Instruction MOV AX,01 MOV BX,01 MOV DX,01 MOV CX,10 A20: INC AX ADD BX,AX SHL DX,1 LOOP A20
LOOPE / LOOPZ Instruction Loop while equal / Loop while zero ตรวจสอบค่า CX และแฟลก ZF ลดค่า CX ทีละ 1 เมื่อคำสั่งถูก execute วนลูปเมื่อ CX เท่ากับ 0 หรือ ZF=1 ออกจากลูปเมื่อ CX<>0 หรือ ZF=0
LOOPNE / LOOPNZ Instruction Loop while not equal / Loop while not zero ตรวจสอบค่า CX และแฟลก ZF ลดค่า CX ทีละ 1 เมื่อคำสั่งถูก execute วนลูปเมื่อ CX ไม่เท่ากับ 0 หรือ ZF=0 ออกจากลูปเมื่อ CX=0 หรือ ZF=1
CMP Instruction เปรียบเทียบค่าที่เป็นตัวเลขใน operand 1 กับ operand 2 ทำงานคล้ายคำสั่ง SUB แต่จะไม่มีการเก็บค่าผลลัพธ์ มีผลต่อแฟลก AF, CF, OF, PF, SF และ ZF
CMP Instruction รูปแบบ [label:] CMP destination,source destination : register/memory source : register/memory/immediate
Conditional Jump Instructions เปลี่ยนแปลงลำดับการทำงานจากจุดหนึ่งไปยังอีกจุดหนึ่งอย่างมีเงื่อนไข รูปแบบ [label:] Jnnn short-address ไม่มีการลดค่า CX แบบอัตโนมัติ
Signed & Unsigned Data Unsigned numeric item (Logical Data) customer number, phone number Signed numeric item (Arithmetic Data) quantity, discount, distance
Signed & Unsigned Data Example CMP CX,DX มองเป็น unsigned data : CX>DX มองเป็น signed data : CX<DX การกำหนด signed หรือ unsigned ขึ้นอยู่กับการเลือกใช้คำสั่ง conditional jump
Conditional Jump : unsigned data JE/JZ : Jump Equal or Jump Zero : ZF JNE/JNZ : Jump Not Equal or Jump Not Zero : ZF JA/JNBE : Jump Above or Jump Not Below or Equal : CF, ZF JAE/JNB : Jump Above or Equal or Jump Not Below : CF JB/JNAE : Jump Below or Jump Not Above or Equal : CF JBE/JNA : Jump Below or Equal or Jump Not Above : AF, ZF
Conditional Jump : signed data JE/JZ : Jump Equal or Jump Zero : ZF JNE/JNZ : Jump Not Equal or Jump Not Zero : ZF JG/JNLE : Jump Greater or Jump Not Less or Equal : OF, SF, ZF JGE/JNL : Jump Greater or Equal or Jump Not Less : OF, SF JL/JNGE : Jump Less or Jump Not Greater or Equal : OF, SF JLE/JNG : Jump Less or Equal or Jump Not Greater : OF, SF, ZF
Conditional Jump : special arithmetic tests JCXZ : Jump if CX is Zero : None JC : Jump Carry : CF JNC : Jump No Carry : CF JO : Jump Overflow : OF JNO : Jump No Overflow : OF JP/JPE : Jump Parity or Jump Parity Even : PF JNP/JPO : Jump No Parity or Jump Parity Odd : PF
Condition Jump : Arithmetic Tests JS : Jump Sign (negative) : SF JNS : Jump No Sign (positive) : SF
Calling Procedures รูปแบบการเขียน Procedure proc-name PROC FAR . proc-name ENDP
Calling Procedures ข้อดีของการเขียน Procedure ลดจำนวน code เสริมสร้างการจัดการโปรแกรมที่ดีกว่า ง่ายต่อการ debug โปรแกรม ช่วยในการ maintenance โปรแกรม
CALL / RET Instructions เป็นคำสั่งที่เรียกใช้ procedure จาก calling program รูปแบบ [label:] CALL proc-name [label:] RET [pop-value]
CALL Instruction Transfer control จาก calling program ไปยัง procedure PUSH ที่อยู่ (offset/segment) ของคำสั่งถัดไปที่จะ execute ไว้บน stack
RET Instruction Transfer control จาก procedure ไปยัง calling program pop ที่อยู่ของคำสั่งถัดไปที่เก็บไว้บน stack ไปไว้ให้กับ IP
Near call and return CALL เรียก procedure ภายในเซกเมนต์เดียวกัน ลดค่า SP ด้วย 2 push ค่า IP ปัจจุบันไปไว้บน stack load offset address ของ call procedure มาไว้ที่ IP RET/RETN pop ค่า IP เดิมจาก stack มาไว้ที่ IP เพิ่มค่า SP ด้วย 2
Far call and return CALL เรียก procedure ในเซกเมนต์อื่น push ค่า CS และ IP ปัจจุบันไปไว้บน stack RET/RETF load segment และ offset address ของ call procedure มาไว้ที่ CS และ IP pop ค่า IP และ CS เดิมจาก stack มาไว้ที่ IP และ CS