add add 目的,源 ; 加法指令,結果放入目操作數,操作數的長度必須相同 adc adc 目的,源 ; 帶進位加法,目的=目的+源+CF and and 目的,源 ; 邏輯按位與 指令,結果放到目的操作數。 ; 影響標誌位OF、SF、ZF、PF和CF。 call call s ; 使call ...
add
add 目的,源 ; 加法指令,結果放入目操作數,操作數的長度必須相同
adc
adc 目的,源 ; 帶進位加法,目的=目的+源+CF
and
and 目的,源 ; 邏輯按位與 指令,結果放到目的操作數。
; 影響標誌位OF、SF、ZF、PF和CF。
call
call s
; 使call s下一條指令的 CS:IP 入棧(段內轉移只有 IP 入棧),跳轉到標號處
cmp
cmp des, sou ; des - sou 不改變 源/目的 的值
註:如果比較的是兩個無符號數,則零標誌位和進位標誌位表示的兩個操作數之間的關係如右表所示:
CMP結果 | ZF | CF |
---|---|---|
目的操作數 < 源操作數 | 0 | 1 |
目的操作數 > 源操作數 | 0 | 0 |
目的操作數 = 源操作數 | 1 | 0 |
註:如果比較的是兩個有符號數,則符號標誌位、零標誌位和溢出標誌位表示的兩個操作數之間的關係如右表所示:
CMP結果 | 標誌位 |
---|---|
目的操作數 < 源操作數 | SF ≠ OF |
目的操作數 > 源操作數 | SF=OF |
目的操作數 = 源操作數 | ZF=1 |
cmov
指令 | 同義名 | 條件 | 描述 |
---|---|---|---|
cmovne | cmovnz | -ZF | ZF不為0時,進行傳送 |
dec
dec 目的 ; 減一(自減)指令。
inc
inc 目的 ; 加一(自增)指令,和add 目的,1效果相同,inc的機器碼更短,,執行快
jmp
無條件跳轉
jmp 標號
jmp short 標號 ; 段內短轉移,位移範圍(-128~127)
jmp near ptr 標號 ; 段內近轉移,位移範圍(-32768~32767)
jmp far ptr 標號 ; 段間轉移
jmp word ptr 記憶體單元地址 ; 段內轉移
jmp dword ptr 記憶體單元地址 ; 段間轉移
jne、jnz
jne s ; 條件轉移指令。當ZF = 0,轉至標號處執行。
jnz s ; 條件轉移指令。當ZF != 0,轉至標號處執行。
lea
lea 目的,源
; 取有效地址指令,獲取的是源的記憶體單元的地址(偏移地址)不是數據
; 源操作數必須是存儲器操作數(ds:[0123H])或者標號
loop
s:
add ax, ax
loop s ; cx寄存器不為0,則跳轉到s;s標號
; 執行時,先(cx)=(cx)-1,再判斷cx是否為0
mov
mov ax, 0 ; 把 0 複製到 ax
mov byte ptr xx:[x], 0 ; 8 位數傳送 ptr – pointer (指針)縮寫。
mov word ptr xx:[x], 0 ; 16 位數傳送
movzx
movzx 16位寄存器, 8位寄存器
; 把8位寄存器的值複製給16位寄存器,前面用0填充
; 只適用於無符號整數
mul
乘法指令
mul 寄存器或記憶體單元
; 兩個相乘的數,位數必須是相同的,如果是8為其中一個預設在AL,結果存放在AX
; 如果是16位其中一個預設在AX,結果高位存放在DX,低位存放在AX
not
not 目的 ; 邏輯非 指令;結果放到目的操作數。
; 不影響標誌位。
offset
mov ax,offset 標號 ; 取標號的偏移地址
; offset是操作符不是彙編指令,由編譯器執行。
or
or 目的,源 ; 邏輯按位或 指令;結果放到目的操作數。
; 影響標誌位OF、SF、ZF、PF和CF。
push
push ax
; 將ax寄存器的數據壓入棧中
; 執行時,先SP - 2,隨後寫入數據,高位對高位,低位對低位.
pop
pop ax
; 從棧中取出數據存入ax
; 執行時,先取出數據寫入ax寄存器,隨後SP + 2
註:如果寄存器是32位的則SP ± 4。(push/pop 8位寄存器 報錯)
ret/retf
ret 相當於 pop ip
retf 相當於 pop ip pop cs
sub
sub 目的,源 ; 減法指令,結果放入目操作數。
sbb
sbb 目的,源 ; 帶借位減法,目的=目的-源-CF
test
test ax, bx
; 將兩個操作數進行 邏輯與 運算,並根據運算結果設置相關的標誌位。
; 但是兩個操作數不會被改變。運算結果在設置過相關標記位後會被丟棄。
; TEST AX,BX 與AND AX,BX命令有相同效果,只是Test指令不改變AX和BX的內容,
; 而AND指令會把結果保存到AX中。
; 影響標誌:C,O,P,Z,S(其中C與O兩個標誌會被設為0)
Intel的技術手冊
TEMP ← SRC1 AND SRC2; // 邏輯與的結果賦值給TEMP
SF ← MSB(TEMP); // 最高位賦值給 SF 標誌位
IF TEMP = 0
THEN ZF ← 1; // TEMP == 0 ZF 標誌位設置1
ELSE ZF ← 0; // TEMP != 0 ZF 標誌位設置0
FI:
PF ← BitwiseXNOR(TEMP[0:7]); // PE = 將TEMP的低8位,從第0位開始,逐位取同或。也就是第0位與第1位的同或結果,去和第2位同或,結果再去和第3位同或....直到和第7位同或。
CF ← 0; // CF 和 OF 標誌位設置0
OF ← 0;
(* AF is undefined *) // AF 不確定
xchg
xchg ax,bx ; 交換兩個寄存器的數據,兩個操作數的類型要相同,記憶體和記憶體之間不能使用
xor
xor 目的,源 ; 邏輯按位異或 指令;結果放到目的操作數。
; 影響標誌位OF、SF、ZF、PF和CF。
標誌寄存器
ZF(零標誌位)
用於記錄相關指令執行後的結果是否為0
為0: ZF = 1 不為0: ZF = 0
影響ZF的指令:add、sub、mul、div、inc、or、and等(大多數是運算指令)
PF(奇偶標誌位)
用於記錄相關指令執行後的結果所有bit位中1的數量是否為偶數
偶數: PF = 1 奇數: PF = 0
SF(符號標誌位)
用於記錄相關指令執行後的結果是否為負
負: SF = 1 非負 :SF = 0
CF(進位標誌位)
一般情況下,在進行無符號運算時,記錄運算結果的最高有效位向更高位的進位值(或借位值)
發生進位(借位):CF = 1 未發生進位(借位): SF = 0
OF(溢出標誌位)
一般情況下,在進行有符號運算時,記錄運算結果是否發生溢出
發生溢出:OF = 1 未發生溢出: OF = 0
未完待續,持續更新中...