跳至內容

X86組合語言/基本指令集

本頁使用了標題或全文手工轉換
維基教科書,自由的教學讀本

首頁 > 電腦科學與技術書架 > X86組合語言 > 基本指令集


資料搬移指令(Data transfer instructions

[編輯]
  • MOV:在通用暫存器之間移動資料;在主記憶體和通用或區段暫存器之間移動資料;將立即數值移動到通用暫存器。(Move data between general-purpose registers; move data between memory and general purpose or segment registers; move immediates to general-purpose registers.)
  • CMOVE/CMOVZ:Conditional move if equal/Conditional move if zero.
  • CMOVNE/CMOVNZ:Conditional move if not equal/Conditional move if not zero.
  • CMOVA/CMOVNBE:Conditional move if above/Conditional move if not below or equal.
  • CMOVAE/CMOVNB:Conditional move if above or equal/Conditional move if not below.
  • CMOVB/CMOVNAE:Conditional move if below/Conditional move if not above or equal.
  • CMOVBE/CMOVNA:Conditional move if below or equal/Conditional move if not above.
  • CMOVG/CMOVNLE:Conditional move if greater/Conditional move if not less or equal.
  • CMOVGE/CMOVNL:Conditional move if greater or equal/Conditional move if not less.
  • CMOVL/CMOVNGE:Conditional move if less/Conditional move if not greater or equal.
  • CMOVLE/CMOVNG:Conditional move if less or equal/Conditional move if not greater.
  • CMOVC:Conditional move if carry.
  • CMOVNC:Conditional move if not carry.
  • CMOVO:Conditional move if overflow.
  • CMOVNO:Conditional move if not overflow.
  • CMOVS:Conditional move if sign (negative).
  • CMOVNS:Conditional move if not sign (non-negative).
  • CMOVP/CMOVPE:Conditional move if parity/Conditional move if parity even.
  • CMOVNP/CMOVPO:Conditional move if not parity/Conditional move if parity odd.
  • XCHG:交換。(Exchange.)
  • BSWAP:Byte swap.
  • XADD:Exchange and add.
  • CMPXCHG:Compare and exchange.
  • CMPXCHG8B:Compare and exchange 8 bytes.
  • PUSH:Push onto stack.
  • POP:Pop off of stack.
  • PUSHA/PUSHAD:Push general-purpose registers onto stack.
  • POPA/POPAD:Pop general-purpose registers from stack.
  • CWD/CDQ:Convert word to doubleword/Convert doubleword to quadword.
  • CBW/CWDE:Convert byte to word/Convert word to doubleword in EAX register.
  • MOVSX:Move and sign extend.
  • MOVZX:Move and zero extend.

二進位算術指令(Binary Arithmetic Instructions

[編輯]
  • ADCX:Unsigned integer add with carry.
  • ADOX:Unsigned integer add with overflow.
  • ADD:Integer add.
  • ADC:含進位的加法。(Add with carry.)
  • SUB:減法。(Subtract.)
  • SBB:含借位的減法。Subtract with borrow.
  • IMUL:有號數乘法。(Signed multiply.)
  • MUL:無號數乘法。(Unsigned multiply.)
  • IDIV:有號數除法。(Signed divide.)
  • DIV:無號數除法。(Unsigned divide.)
  • INC:加一。(Increment.)
  • DEC:減一。(Decrement.)
  • NEG:Negate.
  • CMP:比較。(Compare.)

十進位算術指令(Decimal Arithmetic Instructions

[編輯]
  • DAA:Decimal adjust after addition.
  • DAS:Decimal adjust after subtraction.
  • AAA:ASCII adjust after addition.
  • AAS:ASCII adjust after subtraction.
  • AAM:ASCII adjust after multiplication.
  • AAD:ASCII adjust before division.

邏輯指令(Decimal Arithmetic Instructions

[編輯]
  • AND:Perform bitwise logical AND.
  • OR:Perform bitwise logical OR.
  • XOR:Perform bitwise logical exclusive OR.
  • NOT:Perform bitwise logical NOT

移位及輪轉指令(Shift and Rotate Instruction

[編輯]
  • SAR:Shift arithmetic right.
  • SHR:Shift logical right.
  • SAL/SHL:Shift arithmetic left/Shift logical left.
  • SHRD:Shift right double.
  • SHLD:Shift left double.
  • ROR:Rotate right.
  • ROL:Rotate left.
  • RCR:Rotate through carry right.
  • RCL:Rotate through carry left

位元及位元組指令(Bit and Byte Instructions

[編輯]
  • BT:Bit test.
  • BTS:Bit test and set.
  • BTR:Bit test and reset.
  • BTC:Bit test and complement.
  • BSF:Bit scan forward.
  • BSR:Bit scan reverse.
  • SETE/SETZ:Set byte if equal/Set byte if zero.
  • SETNE/SETNZ:Set byte if not equal/Set byte if not zero.
  • SETA/SETNBE:Set byte if above/Set byte if not below or equal.
  • SETAE/SETNB/SETNC:Set byte if above or equal/Set byte if not below/Set byte if not carry.
  • SETB/SETNAE/SETC:Set byte if below/Set byte if not above or equal/Set byte if carry.
  • SETBE/SETNA:Set byte if below or equal/Set byte if not above.
  • SETG/SETNLE:Set byte if greater/Set byte if not less or equal.
  • SETGE/SETNL:Set byte if greater or equal/Set byte if not less.
  • SETL/SETNGE:Set byte if less/Set byte if not greater or equal.
  • SETLE/SETNG:Set byte if less or equal/Set byte if not greater.
  • SETS:Set byte if sign (negative).
  • SETNS:Set byte if not sign (non-negative).
  • SETO:Set byte if overflow.
  • SETNO:Set byte if not overflow.
  • SETPE/SETP:Set byte if parity even/Set byte if parity.
  • SETPO/SETNP:Set byte if parity odd/Set byte if not parity.
  • TEST:Logical compare.
  • CRC32:Provides hardware acceleration to calculate cyclic redundancy checks for fast and efficient implementation of data integrity protocols.
  • POPCNT:This instruction calculates of number of bits set to 1 in the second operand (source) and returns the count in the first operand (a destination register)

控制轉移指令(Control Transfer Instruction

[編輯]
  • JMP:無條件跳躍(Jump.)
  • JE/JZ:Jump if equal/Jump if zero.
  • JNE/JNZ:Jump if not equal/Jump if not zero.
  • JA/JNBE:Jump if above/Jump if not below or equal.
  • JAE/JNB:Jump if above or equal/Jump if not below.
  • JB/JNAE:Jump if below/Jump if not above or equal.
  • JBE/JNA:Jump if below or equal/Jump if not above.
  • JG/JNLE:Jump if greater/Jump if not less or equal.
  • JGE/JNL:Jump if greater or equal/Jump if not less.
  • JL/JNGE:Jump if less/Jump if not greater or equal.
  • JLE/JNG:Jump if less or equal/Jump if not greater.
  • JC:Jump if carry.
  • JNC:Jump if not carry.
  • JO:Jump if overflow.
  • JNO:Jump if not overflow.
  • JS:Jump if sign (negative).
  • JN:Jump if not sign (non-negative).
  • JPO/JNP:Jump if parity odd/Jump if not parity.
  • JPE/JP:Jump if parity even/Jump if parity.
  • JCXZ/JECXZ:Jump register CX zero/Jump register ECX zero.
  • LOOP:Loop with ECX counter.
  • LOOPZ/LOOPE:Loop with ECX and zero/Loop with ECX and equal.
  • LOOPNZ/LOOPNE:Loop with ECX and not zero/Loop with ECX and not equal.
  • CALL:呼叫副程式或函式。(Call procedure.)
  • RET:從副程式或函式返回。(Return.)
  • IRET:從插斷返回。(Return from interrupt.)
  • INT:軟體插斷。(Software interrupt.)
  • INTO:Interrupt on overflow.
  • BOUND:Detect value out of range.
  • ENTER:High-level procedure entry.
  • LEAVE:High-level procedure exit

字串指令(String Instruction

[編輯]
  • MOVS/MOVSB:Move string/Move byte string.
  • MOVS/MOVSW:Move string/Move word string.
  • MOVS/MOVSD:Move string/Move doubleword string.
  • CMPS/CMPSB:Compare string/Compare byte string.
  • CMPS/CMPSW:Compare string/Compare word string.
  • CMPS/CMPSD:Compare string/Compare doubleword string.
  • SCAS/SCASB:Scan string/Scan byte string.
  • SCAS/SCASW:Scan string/Scan word string.
  • SCAS/SCASD:Scan string/Scan doubleword string.
  • LODS/LODSB:Load string/Load byte string.
  • LODS/LODSW:Load string/Load word string.
  • LODS/LODSD:Load string/Load doubleword string.
  • STOS/STOSB:Store string/Store byte string.
  • STOS/STOSW:Store string/Store word string.
  • STOS/STOSD:Store string/Store doubleword string.
  • REP:Repeat while ECX not zero.
  • REPE/REPZ:Repeat while equal/Repeat while zero.
  • REPNE/REPNZ:Repeat while not equal/Repeat while not zero.

輸入及輸出指令(I/O Instruction

[編輯]
  • IN:Read from a port.
  • OUT:Write to a port.
  • INS/INSB:Input string from port/Input byte string from port.
  • INS/INSW:Input string from port/Input word string from port.
  • INS/INSD:Input string from port/Input doubleword string from port.
  • OUTS/OUTSB:Output string to port/Output byte string to port.
  • OUTS/OUTSW:Output string to port/Output word string to port

進入及離開指令(Enter and Leave Instruction

[編輯]
  • ENTER:High-level procedure entry.
  • LEAVE:High-level procedure exit

旗標控制(EFLAG)指令(Flag Control (EFLAG) Instructions

[編輯]
  • STC:設定進位旗標。(Set carry flag.)
  • CLC:清除進位旗標。(Clear the carry flag.)
  • CMC:Complement the carry flag.
  • CLD:Clear the direction flag.
  • STD:Set direction flag.
  • LAHF:Load flags into AH register.
  • SAHF:Store AH register into flags.
  • PUSHF/PUSHFD:Push EFLAGS onto stack.
  • POPF/POPFD:Pop EFLAGS from stack.
  • STI:設定插斷旗標。(Set interrupt flag.)
  • CLI:清除插斷旗標。(Clear the interrupt flag)

區段暫存器指令(Segment Register Instruction

[編輯]
  • LDS:Load far pointer using DS.
  • LES:Load far pointer using ES.
  • LFS:Load far pointer using FS.
  • LGS:Load far pointer using GS.
  • LSS:Load far pointer using SS

雜項指令(Miscellaneous Instruction

[編輯]
  • LEA:Load effective address.
  • NOP:無運算。(No operation.)
  • UD:Undefined instruction.
  • XLAT/XLATB:Table lookup translation.
  • CPUID:Processor identification.
  • MOVBE: Move data after swapping data bytes.
  • PREFETCHW: Prefetch data into cache in anticipation of write.
  • PREFETCHWT: Prefetch hint T1 with intent to write.
  • CLFLUSH:Flushes and invalidates a memory operand and its associated cache line from all levels of the processor’s cache hierarchy.
  • CLFLUSHOPT:Flushes and invalidates a memory operand and its associated cache line from all levels of the processor’s cache hierarchy with optimized memory system throughput

使用者模式擴展狀態的儲存及還原指令(User Mode Extended Sate Save/Restore Instruction

[編輯]
  • XSAVE:Save processor extended states to memory.
  • XSAVEC:Save processor extended states with compaction to memory.
  • XSAVEOPT:Save processor extended states to memory, optimized.
  • XRSTOR:Restore processor extended states from memory.
  • XGETBV:Reads the state of an extended control register

亂數產生指令(Random Number Generator Instructions

[編輯]
  • RDRAND:Retrieves a random number generated from hardware.
  • RDSEED:Retrieves a random number generated from hardwar

BMI1, BMI2

[編輯]
  • ANDN:Bitwise AND of first source with inverted 2nd source operands.
  • BEXTR:Contiguous bitwise extract.
  • BLSI:Extract lowest set bit.
  • BLSMSK:Set all lower bits below first set bit to 1.
  • BLSR:Reset lowest set bit.
  • BZHI:Zero high bits starting from specified bit position.
  • LZCNT:Count the number leading zero bits.
  • MULX:Unsigned multiply without affecting arithmetic flags.
  • PDEP:Parallel deposit of bits using a mask.
  • PEXT:Parallel extraction of bits using a mask.
  • RORX:Rotate right without affecting arithmetic flags.
  • SARX:Shift arithmetic right.
  • SHLX:Shift logic left.
  • SHRX:Shift logic right.
  • TZCNT:Count the number trailing zero bits

Detection of VEX-encoded GPR Instructions, LZCNT and TZCNT, PREFETCH

[編輯]

以下內容待整理

[編輯]

資料搬移指令 (Data transfer instructions

[編輯]

整數運算指令

[編輯]

加法

[編輯]
  • add : 加
  • adc : 加 (含進位)
  • inc : 加1

減法

[編輯]
  • sub : 減
  • sbb : 減 (含借位)
  • dec : 減1

乘法

[編輯]
  • mul : 乘 (無號數)
  • imul : 乘 (有號數)

除法

[編輯]
  • div : 除 (無號數)
  • idiv : 除 (有號數)

邏輯運算指令

[編輯]

位元位移指令

[編輯]

程式流程控制

[編輯]

跳越指令

[編輯]

無條件跳越

[編輯]

無號數運算(比較)後使用的條件跳越指令

[編輯]
指令 意義 條件
je 若等於則跳越 x = y ZF=1
jne 若不等於則跳越 x≠y ZF=0
ja
jnbe
若高於則跳越
若不低於則跳越
x > y CF=0且ZF=0
jae
jnb
若高於或等於則跳越
若不低於或等於則跳越
x≧y CF=0
jb
jnae
若低於則跳越
若不高於或等於則跳越
x < y CF=1
jbe
jna
若低於或等於則跳越
若不高於則跳越
x≦y CF=1或ZF=1

有號數運算(比較)後使用的條件跳越指令

[編輯]
指令 意義 條件
je 若等於則跳越 x = y ZF=1
jne 若不等於則跳越 x≠y ZF=0
jg
jnle
若大於則跳越
若不低於或等於則跳越
x > y ZF=0且SF=OF
jge
jnl
若高於於或等於則跳越
若不低於則跳越
x≧y SF=OF
jl
jngl
若低於則跳越
若不大於或等於則跳越
x < y SF≠OF
jle
jng
若低於或等於則跳越
若不大於則跳越
x≦y ZF=1或SF≠OF

依旗號狀態判斷的條件跳越指令

[編輯]
指令 意義 條件
jc 若進位則跳越 CF=1
jnc 若無進位則跳越 CF=0
js 若為負數則跳越 SF=1
jns 若為正數則跳越 SF=0
jz 若等於0則跳越 ZF=1
jnz 若不等於0則跳越 ZF=0
jp 若同位則跳越 PF=1
jnp 若沒有同位則跳越 PF=0
jpe 若偶同位則跳越 PF=1
jpo 若奇同位則跳越 PF=0
jo 若溢位則跳越 OF=1
jno 若沒有溢位則跳越 OF=0

迴圈控制指令

[編輯]

中斷指令(Interrupt Instruction

[編輯]
  • int : 進入中斷處理程式
  • into : 運算溢位,產生中斷
  • iret : 自中斷處理程式中返回

旗標控制相關指令

[編輯]

中斷標誌位

[編輯]
  • cli : 清中斷允許
  • sti : 置中斷允許

進位標誌位

[編輯]
  • clc : 清進位標誌位
  • stc : 置進位標誌位
  • cmc : 進位標誌位取反

  • 以下暫存
    mov:這是組語裡面最常見的指令,將數值記入暫存器或是將A暫存器的內涵值移入B暫存器等等.
    範例語法:  mov 目的,來源        <==將來源值移入目的暫存器
                 mov DX,[zzz]       <==將zzz變數內涵移入DX暫存器
                 mov EAX,14h        <==移14h值移入EAX
    int:呼叫中斷來處理之前暫存器內涵值所對應的工作.例如Linux是int 0x80.
    add:加
     sub:減
     mul:乘
     div:除