組合語言(有助於閱讀數據)
對於許多會用到的指令更加熟悉...
一般指令
指令 說明
MOV x,y x=y(y搬到x)
ADD x,y 將 x, y 的值相加,並將結果存至 x
SUB x,y 將 x, y 的值相減,並將結果存至 x
CMP x,y 比較 x, y 的值,其運算與 SUB 類似,但其運算後的值不儲存,只會影響 flags 的值
DEC x 將 x 的值減 1
INC x 將 x 的值加 1
NEG x 將 x 的值做 2's complement
LEA x,y 將 y 的地址給 x
JMP x 無條件、無範圍限制地跳到 x( destination label ) 的地方
JCXZ x 若 CX 的值為 0,則跳到 x( destination label ) 的地方
LOOP x 用 CX 計數(指能用CX)的 for loop,每次遇到此指令,CX 的值都將自動被減 1,若 CX 不等於 0,
則會跳到 x( destinationlabel ) 的地方
x EQU y 在程式中,遇到 x 出現的地方都替換為 y,如:LF EQU 0Dh,就是將 LF 替換為 0Dh
XCHG x,y 交換 x 與 y 的值
Logic, Shift, and Rotate Instructions
指令 說明
NOT x 對 x 做 1's complement(原本的 0 會變成 1,1 會變成 0)
AND x,y 讓 x 與 y 做 AND 邏輯運算,並把結果存在 x
OR x,y 讓 x 與 y 做 OR 邏輯運算,並把結果存在 x
XOR x,y 讓 x 與 y 做 OR 邏輯運算,並把結果存在 x
SHL x,y 將 x 往左 shift y bits(x 被推到最左邊超出範圍的位數放入 CF,不足的右邊位數補 0)
SAL x,y 功能與 SHL 完全相同,但此指令通常被用在 數學運算 的情況下(如: x * 2y)
SHR x,y 將 x 往右 shift y bits(x 被推到最右邊超出範圍的位數放入 CF,不足的左邊位數補 0)
SAR x,y 功能與 SHR 相似(x 被推到最右邊超出範圍的位數放入 CF,不足的左邊位數補入原本 msb 的
bit 值),此指令通常被用在 數學運算 的情況下(如: x / 2y)
ROL x,y 將 x 往左 shift y bits(x 被推到最左邊超出範圍的位數放入 CF、以及放入 x 的 lsb)
ROR x,y 將 x 往右 shift y bits(x 被推到最右邊超出範圍的位數放入 CF、以及放入 x 的 msb)
RCL x,y 將 x 往左 shift y bits(x 被推到最左邊超出範圍的位數放入 CF,CF 的值放入 x 的 lsb)
RCR x,y 將 x 往右 shift y bits(x 被推到最右邊超出範圍的位數放入 CF、CF 的值放入 x 的 msb)
P.S. 關於 shift 與 rotate 的指令,若是欲將 y 設為變數,則只能使用 CL,不可使用其他變數或是 register
Stack & procdure instructions
指令 說明
PUSH x 將 x ( x 必須為 word ) push 進 stack 中(SP 會先加 1,再將 x 加入 stack 中)
PUSHF 將 FLAGS push 進 stack 中
POP x 從 stack 中 pop 出一個 word 放入 x(SP 會先 pop,再減 1)
PUSHF 從 stack 中 pop 出一個 word 放入 FLAGS 中
CALL 呼叫 程序
RET x 從 程序 中跳出,若有給 參數 x,則在 RET 之後,會將 SP 往下加 x bytes
Multiplication and Division Instructions
指令 說明
MUL x 若 x 的資料型態是 byte,將 x 與 AL 相乘,將結果儲存於 AX
若 x 的資料型態是 word,將 x 與 AX 相乘,將結果儲存於 DX 與 AX
此指令通常用來運算 unsigned multiplication
IMUL x 若 x 的資料型態是 byte,將 x 與 AL 相乘,將結果儲存於 AX
若 x 的資料型態是 word,將 x 與 AX 相乘,將結果儲存於 DX 與 AX
此指令通常用來運算 signed multiplication
DIV x 若 x 的資料型態是 byte,將 x 除以 AX(AX 為被除數),將餘數儲存於 AH、將商儲存於 AL 中
若 x 的資料型態是 word,將 x 除以 DX:AX(DX:AX 合起來看為被除數),將餘數儲存於 DX、將商儲存於
AX 中
此指令通常用來運算 unsigned division
IDIV x 若 x 的資料型態是 byte,將 x 除以 AX(AX 為被除數),將餘數儲存於 AH、將商儲存於 AL 中
若 x 的資料型態是 word,將 x 除以 DX:AX(DX:AX 合起來看為被除數),將餘數儲存於 DX、將商儲存於
AX 中
此指令通常用來運算 signed division
CWD 當使用 IDIV 時,使用此指令可以將未使用的被除數左半部的 bits 全數填入被除數右半部的
signed bit(此指令適用於 word 的除法)
CBW 當使用 IDIV 時,使用此指令可以將未使用的被除數左半部的 bits 全數填入被除數右半部的
signed bit(此指令適用於 byte 的除法)
String operations 相關指令
指令 說明
CLD 把 DF 設定為 0
STD 把 DF 設定為 1
REP MOVSB 若 CX 還不是 0 時,就一直重複做 MOVSB 的動作,每做一次 CX 自動減 1
REP MOVSW 若 CX 還不是 0 時,就一直重複做 MOVSW 的動作,每做一次 CX 自動減 1
REPNE SCASB 若 CX 還不是 0 時,或是還沒找到與存放於 AL 或 AX 相同的資料時,
就一直重複做SCASB 的動作,每做一次 CX 自動減 1
REPNE SCASW 若 CX 還不是 0 時,或是還沒找到與存放於 AL 或 AX 相同的資料時,
就一直重複做 SCASW 的動作,每做一次 CX 自動減 1
REPE CMPSB 若 CX 還不是 0 時,或是還沒找到與 destination arry 中不相同的資料時,
就一直重複做 CMPSB 的動作,每做一次 CX 自動減 1
REPE CMPSW 若 CX 還不是 0 時,或是還沒找到與 destination arry 中不相同的資料時,
就一直重複做 CMPSW 的動作,每做一次 CX 自動減 1
以下 string operations
若 DF 被設定為 「0」,每執行完一次指令,有使用到 DI 或 SI 的, DI 或 SI 將會自動「加 1 or 2」
若 DF 被設定為 「1」,每執行完一次指令,有使用到 DI 或 SI 的, DI 或 SI 將會自動「減 1 or 2」
(若是使用 xxxSB,每次調整 1,若是使用 xxxSW,則次調整 2)
Symbol Source Destination Description
MOVSB / MOVSW DS : SI ES : DI move one byte from source to destination
STOSB / STOSW AL / AX ES : DI move AL/AX to the destination at ES:DI
LODSB / LODSW DS : SI AL / AX move one byte from source at DS:SI into AL/AX
SCASB / SCASW AL / AX ES : DI subtracts the string byte at ES:DI from AL/AX
CMPSB / CMPSW DS : SI ES : DI the byte/word at DS : SI - the byte/word at ES:DI
Single-Flag Jumps
指令 說明 旗標
Jc jump if carry CF = 1
Jnc jump if no carry CF = 0
Jo jump if overflow OF = 1
Jno jump if no overflow OF = 0
Js jump if sign negative SF = 1
Jns jump if nonnegative sign SF = 0
Jpe / Jp jump if parity even PF = 1
Jnp / Jop jump if parity odd PF = 0
Jmp 無條件跳躍
Je / Jz 如果均等執行跳躍 ZF = 1
Ja / Jnbe 如果大於跳躍 ZF = 0 and CF = 0
Jae / Jnb 如果大於等於跳躍 CF = 0
Jb / Jnae 如果小於跳躍 CF = 1
Jbe / Jna 如果小於等於跳躍 CF = 1 or ZF = 1
Jne / Jnz 如果不相等執行跳躍 ZF = 0
Jg / Jnle 如果大於執行跳躍 ZF = 0 and SF = OF
Jng 如果不大於執行跳躍
Jl / Jnge 如果小於執行跳躍 SF <> OF
Jnl 如果不是比較少執行跳躍
Jge / Jnl 如果大於或等於執行跳躍 SF = OF
Jle / Jng 如果小於或等於執行跳躍 ZF = 1 or SF <> OF
一般指令
指令 說明
MOV x,y x=y(y搬到x)
ADD x,y 將 x, y 的值相加,並將結果存至 x
SUB x,y 將 x, y 的值相減,並將結果存至 x
CMP x,y 比較 x, y 的值,其運算與 SUB 類似,但其運算後的值不儲存,只會影響 flags 的值
DEC x 將 x 的值減 1
INC x 將 x 的值加 1
NEG x 將 x 的值做 2's complement
LEA x,y 將 y 的地址給 x
JMP x 無條件、無範圍限制地跳到 x( destination label ) 的地方
JCXZ x 若 CX 的值為 0,則跳到 x( destination label ) 的地方
LOOP x 用 CX 計數(指能用CX)的 for loop,每次遇到此指令,CX 的值都將自動被減 1,若 CX 不等於 0,
則會跳到 x( destinationlabel ) 的地方
x EQU y 在程式中,遇到 x 出現的地方都替換為 y,如:LF EQU 0Dh,就是將 LF 替換為 0Dh
XCHG x,y 交換 x 與 y 的值
Logic, Shift, and Rotate Instructions
指令 說明
NOT x 對 x 做 1's complement(原本的 0 會變成 1,1 會變成 0)
AND x,y 讓 x 與 y 做 AND 邏輯運算,並把結果存在 x
OR x,y 讓 x 與 y 做 OR 邏輯運算,並把結果存在 x
XOR x,y 讓 x 與 y 做 OR 邏輯運算,並把結果存在 x
SHL x,y 將 x 往左 shift y bits(x 被推到最左邊超出範圍的位數放入 CF,不足的右邊位數補 0)
SAL x,y 功能與 SHL 完全相同,但此指令通常被用在 數學運算 的情況下(如: x * 2y)
SHR x,y 將 x 往右 shift y bits(x 被推到最右邊超出範圍的位數放入 CF,不足的左邊位數補 0)
SAR x,y 功能與 SHR 相似(x 被推到最右邊超出範圍的位數放入 CF,不足的左邊位數補入原本 msb 的
bit 值),此指令通常被用在 數學運算 的情況下(如: x / 2y)
ROL x,y 將 x 往左 shift y bits(x 被推到最左邊超出範圍的位數放入 CF、以及放入 x 的 lsb)
ROR x,y 將 x 往右 shift y bits(x 被推到最右邊超出範圍的位數放入 CF、以及放入 x 的 msb)
RCL x,y 將 x 往左 shift y bits(x 被推到最左邊超出範圍的位數放入 CF,CF 的值放入 x 的 lsb)
RCR x,y 將 x 往右 shift y bits(x 被推到最右邊超出範圍的位數放入 CF、CF 的值放入 x 的 msb)
P.S. 關於 shift 與 rotate 的指令,若是欲將 y 設為變數,則只能使用 CL,不可使用其他變數或是 register
Stack & procdure instructions
指令 說明
PUSH x 將 x ( x 必須為 word ) push 進 stack 中(SP 會先加 1,再將 x 加入 stack 中)
PUSHF 將 FLAGS push 進 stack 中
POP x 從 stack 中 pop 出一個 word 放入 x(SP 會先 pop,再減 1)
PUSHF 從 stack 中 pop 出一個 word 放入 FLAGS 中
CALL 呼叫 程序
RET x 從 程序 中跳出,若有給 參數 x,則在 RET 之後,會將 SP 往下加 x bytes
Multiplication and Division Instructions
指令 說明
MUL x 若 x 的資料型態是 byte,將 x 與 AL 相乘,將結果儲存於 AX
若 x 的資料型態是 word,將 x 與 AX 相乘,將結果儲存於 DX 與 AX
此指令通常用來運算 unsigned multiplication
IMUL x 若 x 的資料型態是 byte,將 x 與 AL 相乘,將結果儲存於 AX
若 x 的資料型態是 word,將 x 與 AX 相乘,將結果儲存於 DX 與 AX
此指令通常用來運算 signed multiplication
DIV x 若 x 的資料型態是 byte,將 x 除以 AX(AX 為被除數),將餘數儲存於 AH、將商儲存於 AL 中
若 x 的資料型態是 word,將 x 除以 DX:AX(DX:AX 合起來看為被除數),將餘數儲存於 DX、將商儲存於
AX 中
此指令通常用來運算 unsigned division
IDIV x 若 x 的資料型態是 byte,將 x 除以 AX(AX 為被除數),將餘數儲存於 AH、將商儲存於 AL 中
若 x 的資料型態是 word,將 x 除以 DX:AX(DX:AX 合起來看為被除數),將餘數儲存於 DX、將商儲存於
AX 中
此指令通常用來運算 signed division
CWD 當使用 IDIV 時,使用此指令可以將未使用的被除數左半部的 bits 全數填入被除數右半部的
signed bit(此指令適用於 word 的除法)
CBW 當使用 IDIV 時,使用此指令可以將未使用的被除數左半部的 bits 全數填入被除數右半部的
signed bit(此指令適用於 byte 的除法)
String operations 相關指令
指令 說明
CLD 把 DF 設定為 0
STD 把 DF 設定為 1
REP MOVSB 若 CX 還不是 0 時,就一直重複做 MOVSB 的動作,每做一次 CX 自動減 1
REP MOVSW 若 CX 還不是 0 時,就一直重複做 MOVSW 的動作,每做一次 CX 自動減 1
REPNE SCASB 若 CX 還不是 0 時,或是還沒找到與存放於 AL 或 AX 相同的資料時,
就一直重複做SCASB 的動作,每做一次 CX 自動減 1
REPNE SCASW 若 CX 還不是 0 時,或是還沒找到與存放於 AL 或 AX 相同的資料時,
就一直重複做 SCASW 的動作,每做一次 CX 自動減 1
REPE CMPSB 若 CX 還不是 0 時,或是還沒找到與 destination arry 中不相同的資料時,
就一直重複做 CMPSB 的動作,每做一次 CX 自動減 1
REPE CMPSW 若 CX 還不是 0 時,或是還沒找到與 destination arry 中不相同的資料時,
就一直重複做 CMPSW 的動作,每做一次 CX 自動減 1
以下 string operations
若 DF 被設定為 「0」,每執行完一次指令,有使用到 DI 或 SI 的, DI 或 SI 將會自動「加 1 or 2」
若 DF 被設定為 「1」,每執行完一次指令,有使用到 DI 或 SI 的, DI 或 SI 將會自動「減 1 or 2」
(若是使用 xxxSB,每次調整 1,若是使用 xxxSW,則次調整 2)
Symbol Source Destination Description
MOVSB / MOVSW DS : SI ES : DI move one byte from source to destination
STOSB / STOSW AL / AX ES : DI move AL/AX to the destination at ES:DI
LODSB / LODSW DS : SI AL / AX move one byte from source at DS:SI into AL/AX
SCASB / SCASW AL / AX ES : DI subtracts the string byte at ES:DI from AL/AX
CMPSB / CMPSW DS : SI ES : DI the byte/word at DS : SI - the byte/word at ES:DI
Single-Flag Jumps
指令 說明 旗標
Jc jump if carry CF = 1
Jnc jump if no carry CF = 0
Jo jump if overflow OF = 1
Jno jump if no overflow OF = 0
Js jump if sign negative SF = 1
Jns jump if nonnegative sign SF = 0
Jpe / Jp jump if parity even PF = 1
Jnp / Jop jump if parity odd PF = 0
Jmp 無條件跳躍
Je / Jz 如果均等執行跳躍 ZF = 1
Ja / Jnbe 如果大於跳躍 ZF = 0 and CF = 0
Jae / Jnb 如果大於等於跳躍 CF = 0
Jb / Jnae 如果小於跳躍 CF = 1
Jbe / Jna 如果小於等於跳躍 CF = 1 or ZF = 1
Jne / Jnz 如果不相等執行跳躍 ZF = 0
Jg / Jnle 如果大於執行跳躍 ZF = 0 and SF = OF
Jng 如果不大於執行跳躍
Jl / Jnge 如果小於執行跳躍 SF <> OF
Jnl 如果不是比較少執行跳躍
Jge / Jnl 如果大於或等於執行跳躍 SF = OF
Jle / Jng 如果小於或等於執行跳躍 ZF = 1 or SF <> OF
留言
張貼留言