win32汇编指令汇总
生活随笔
收集整理的這篇文章主要介紹了
win32汇编指令汇总
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
-----------------------算數運算指令-----------------------
ADD????????? 加法
ADC????????? 帶位加法
SBB ??? ????? 帶位減法
SUB????????? 減法.
INC????????? 加法.
NEC????????? 求反(以0減之).?
NEG????????? 求反然后加1,假如NEG AL相當于Not AL; INC AL
CMP????????? 比較.(兩操作數作減法,僅修改標志位,不回送結果).?
INC DPTR???? 數據指針寄存器值加1 (說明:將16位的DPTR加1,當DPTR的低字節(DPL)從FFH溢出至00H時,會使高字
節(DPH)加1,不影響任何標志位)
MUL A B???? 將累加器的值與B寄存器的值相乘,乘積的低位字節存回累加器,高位字節存回B寄存器(說明:將累加
器A和寄存器B內的無符號整數相乘,產生16位的積,低位字節存入A,高位字節存入B寄存器.如果積大于FFH,則溢出
DIV A B???? 將累加器的值除以B寄存器的值,結果的商存回累加器,余數存回B寄存器(說明:無符號的除法運算,
將累加器A除以B寄存器的值,商存入A,余數存入B。執行本指令后,進位位(C)及溢出位(OV)被清除為0)
IDIV??? 整數除法. 以上兩條,結果回送: 商回送AL,余數回送AH, (字節運算);? 或? 商回送AX,余數回送DX, (字運
算).?
?AAA??? 加法的ASCII碼調整.?
?DAA??? 加法的十進制調整.?
?AAS??? 減法的ASCII碼調整.?
?DAS??? 減法的十進制調整.?
?AAM??? 乘法的ASCII碼調整.?
?AAD??? 除法的ASCII碼調整.?
?CBW?? 字節轉換為字. (把AL中字節的符號擴展到AH中去)?
?CWD?? 字轉換為雙字. (把AX中的字的符號擴展到DX中去)?
?CWDE? 字轉換為雙字. (把AX中的字符號擴展到EAX中去)?
?CDQ?? 雙字擴展.???? (把EAX中的字的符號擴展到EDX中去)?
-----------------------邏輯運算指令---------------------------------
AND??? 與運算.?
OR????? 或運算.?
XOR??? 異或運算.?
NOT??? 取反.?
TEST??? 測試.(兩操作數作與運算,僅修改標志位,不回送結果).?
SHL??? 邏輯左移.
SHR??? 邏輯右移. ?
SAL??? 算術左移.(=SHL)?
SAR??? 算術右移. (左移是一樣的,右移是不同的.邏輯右移補0,算術右移補最高位)? ?
ROL??? 循環左移.? ( ((unsigned char)a) << 5 ) | ( ((unsigned char)a) >> 3 )?
????????????????? rol eax,cl ==> eax=(eax<<cl)+(eax>>(32-cl));?
ROR??? 循環右移.? ror eax,cl ==> eax=(eax>>cl)+(eax<<(32-cl));
RCL??? 通過進位的循環左移.?
RCR??? 通過進位的循環右移.?
以上八種移位指令,其移位次數可達255次.?
?? ?移位一次時, 可直接用操作碼.? 如 SHL AX,1.?
?? ?移位>1次時, 則由寄存器CL給出移位次數.?
?? ???? 如? MOV CL,04?
?? ??? ?SHL AX,CL?
-----------------------數據轉移指令---------------------------------
1. 通用數據傳送指令.?
?? ?MOV??? 傳送字或字節.?
?? ?MOVSX? 先符號擴展,再傳送.?
?? ?MOVZX? 先零擴展,再傳送.?
?? ?PUSH??? 把字壓入堆棧.?
?? ?POP??? 把字彈出堆棧.?
?? ?PUSHA? 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆棧.?
?? ?POPA??? 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆棧.?
?? ?PUSHAD? 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆棧.?
?? ?POPAD? 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆棧.?
?? ?BSWAP? 交換32位寄存器里字節的順序?
?? ?XCHG??? 交換字或字節.( 至少有一個操作數為寄存器,段寄存器不可作為操作數)?
?? ?CMPXCHG 比較并交換操作數.( 第二個操作數必須為累加器AL/AX/EAX )?
?? ?XADD??? 先交換再累加.( 結果在第一個操作數里 )?
?? ?XLAT??? 字節查表轉換.?
?? ??? ?── BX 指向一張 256 字節的表的起點, AL 為表的索引值 (0-255,即 0-FFH); 返回 AL??????? ?
?????? 為查表結果. ( [BX+AL]->AL )?
2. 輸入輸出端口傳送指令.?
?? ?IN????? I/O端口輸入. ( 語法: IN 累加器, {端口號│DX} )?
?? ?OUT??? I/O端口輸出. ( 語法: OUT {端口號│DX},累加器 )?
?? ??? ?輸入輸出端口由立即方式指定時, 其范圍是 0-255; 由寄存器 DX 指定時,?
LEA??? 裝入有效地址.? 例: LEA DX,string? ;把偏移地址存到DX.?
LDS??? 傳送目標指針,把指針內容裝入DS. 例: LDS SI,string? ;把段地址:偏移地址存到DS:SI.?
LES??? 傳送目標指針,把指針內容裝入ES. 例: LES DI,string? ;把段地址:偏移地址存到ES:DI.?
LFS??? 傳送目標指針,把指針內容裝入FS. 例: LFS DI,string? ;把段地址:偏移地址存到FS:DI.?
LGS??? 傳送目標指針,把指針內容裝入GS. 例: LGS DI,string? ;把段地址:偏移地址存到GS:DI.?
LSS??? 傳送目標指針,把指針內容裝入SS. 例: LSS DI,string? ;把段地址:偏移地址存到SS:DI.?
----------------------- 標志傳送指令-----------------------?
LAHF??? 標志寄存器傳送,把標志裝入AH.?
SAHF??? 標志寄存器傳送,把AH內容裝入標志寄存器.?
PUSHF?? 標志入棧.?
POPF??? 標志出棧.?
PUSHD?? 32位標志入棧.?
POPD??? 32位標志出棧.?
0012F618? |00A8E5A8? ASCII "nk'MHBh30"
-----------------------程序轉移指令 -----------------------
1>無條件轉移指令 (長轉移)?
?? ?JMP??? 無條件轉移指令?
?? ?CALL??? 過程調用?
?? ?RET/RETF過程返回.?
2>條件轉移指令 (短轉移,-128到+127的距離內)?
?? ?( 當且僅當(SF XOR OF)=1時,OP1<OP2 )?
?? ?JA/JNBE 不小于或不等于時轉移.?
?? ?JAE/JNB 大于或等于轉移.?
?? ?JB/JNAE 小于轉移.?
?? ?JBE/JNA 小于或等于轉移.?
?? ??? ?以上四條,測試無符號整數運算的結果(標志C和Z).?
?? ?JG/JNLE 大于轉移.?
?? ?JGE/JNL 大于或等于轉移.?
?? ?JL/JNGE 小于轉移.?
?? ?JLE/JNG 小于或等于轉移.?
?? ??? ?以上四條,測試帶符號整數運算的結果(標志S,O和Z).?
?? ?JE/JZ? 等于轉移.?
?? ?JNE/JNZ 不等于時轉移.?
?? ?JC????? 有進位時轉移.?
?? ?JNC??? 無進位時轉移.?
?? ?JNO??? 不溢出時轉移.?
?? ?JNP/JPO 奇偶性為奇數時轉移.?
?? ?JNS??? 符號位為 "0" 時轉移.?
?? ?JO????? 溢出轉移.?
?? ?JP/JPE? 奇偶性為偶數時轉移.?
?? ?JS????? 符號位為 "1" 時轉移.?
3>循環控制指令(短轉移)?
?? ?LOOP??????????? CX不為零時循環.?
?? ?LOOPE/LOOPZ??? CX不為零且標志Z=1時循環.?
?? ?LOOPNE/LOOPNZ? CX不為零且標志Z=0時循環.?
?? ?JCXZ??????????? CX為零時轉移.?
?? ?JECXZ????????? ECX為零時轉移.?
4>中斷指令?
?? ?INT??? 中斷指令?
?? ?INTO??? 溢出中斷?
?? ?IRET??? 中斷返回?
5>處理器控制指令?
?? ?HLT??? 處理器暫停, 直到出現中斷或復位信號才繼續.?
?? ?WAIT??? 當芯片引線TEST為高電平時使CPU進入等待狀態.?
?? ?ESC??? 轉換到外處理器.?
?? ?LOCK??? 封鎖總線.?
?? ?NOP??? 空操作.?
?? ?STC??? 置進位標志位.?
?? ?CLC??? 清進位標志位.?
?? ?CMC??? 進位標志取反.?
?? ?STD??? 置方向標志位.?
?? ?CLD??? 清方向標志位.?
?? ?STI??? 置中斷允許位.?
?? ?CLI??? 清中斷允許位.?
-----------------------串指令-----------------------
DS:SI?? 源串段寄存器? :串變址.?
ES:DI?? 目標串段寄存器:串變址.?
CX????? 重復次數計數器.?
AL/AX?? 掃描值.?
D標志?? 0表示重復操作中SI和DI應自動增量; 1表示應自動減量.?
Z標志?? 用來控制掃描或比較操作的結束.?
cld? 將DF置為0
std? 將DF置為1
MOVS??? 串傳送.?
??? ( MOVSB? 傳送字符。將ds:si指向的內存單元中的字節送入es:di中,然后根據DF的標志將si和di的值增或減(0增1減)
????? MOVSW? 傳送字。? 將ds:si指向的內存單元中的字節送入es:di中,然后根據DF的標志將si和di的值增或減(0增1減)?
????? MOVSD? 傳送雙字. ) 經常這么用rep movsb相當于s:movsb ; loop s
CMPS??? 串比較.?
??? ( CMPSB? 比較字符.??? CMPSW? 比較字. )?
SCAS??? 串掃描. 把AL或AX的內容與目標串作比較,比較結果反映在標志位.?
LODS??? 裝入串. 把源串中的元素(字或字節)逐一裝入AL或AX中.?
??? ( LODSB? 傳送字符.??? LODSW? 傳送字.??? LODSD? 傳送雙字. )?
STOS??? 保存串.是LODS的逆過程.?
REP??????????? 當CX/ECX<>0時重復.?
REPE/REPZ????? 當ZF=1或比較結果相等,且CX/ECX<>0時重復.?
REPNE/REPNZ??? 當ZF=0或比較結果不相等,且CX/ECX<>0時重復.?
REPC?????????? 當CF=1且CX/ECX<>0時重復.?
REPNC????????? 當CF=0且CX/ECX<>0時重復.?
-----------------------偽指令-----------------------
DW????? 定義字(2字節).?
PROC??? 定義過程.?
ENDP??? 過程結束.?
SEGMENT 定義段.?
ASSUME? 建立段寄存器尋址.?
ENDS??? 段結束.?
END??? 程序結束. ? 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
ADD????????? 加法
ADC????????? 帶位加法
SBB ??? ????? 帶位減法
SUB????????? 減法.
INC????????? 加法.
NEC????????? 求反(以0減之).?
NEG????????? 求反然后加1,假如NEG AL相當于Not AL; INC AL
CMP????????? 比較.(兩操作數作減法,僅修改標志位,不回送結果).?
INC DPTR???? 數據指針寄存器值加1 (說明:將16位的DPTR加1,當DPTR的低字節(DPL)從FFH溢出至00H時,會使高字
節(DPH)加1,不影響任何標志位)
MUL A B???? 將累加器的值與B寄存器的值相乘,乘積的低位字節存回累加器,高位字節存回B寄存器(說明:將累加
器A和寄存器B內的無符號整數相乘,產生16位的積,低位字節存入A,高位字節存入B寄存器.如果積大于FFH,則溢出
標志位(OV)被設定為1,而進位標志位為0)?
DIV A B???? 將累加器的值除以B寄存器的值,結果的商存回累加器,余數存回B寄存器(說明:無符號的除法運算,
將累加器A除以B寄存器的值,商存入A,余數存入B。執行本指令后,進位位(C)及溢出位(OV)被清除為0)
IDIV??? 整數除法. 以上兩條,結果回送: 商回送AL,余數回送AH, (字節運算);? 或? 商回送AX,余數回送DX, (字運
算).?
?AAA??? 加法的ASCII碼調整.?
?DAA??? 加法的十進制調整.?
?AAS??? 減法的ASCII碼調整.?
?DAS??? 減法的十進制調整.?
?AAM??? 乘法的ASCII碼調整.?
?AAD??? 除法的ASCII碼調整.?
?CBW?? 字節轉換為字. (把AL中字節的符號擴展到AH中去)?
?CWD?? 字轉換為雙字. (把AX中的字的符號擴展到DX中去)?
?CWDE? 字轉換為雙字. (把AX中的字符號擴展到EAX中去)?
?CDQ?? 雙字擴展.???? (把EAX中的字的符號擴展到EDX中去)?
-----------------------邏輯運算指令---------------------------------
AND??? 與運算.?
OR????? 或運算.?
XOR??? 異或運算.?
NOT??? 取反.?
TEST??? 測試.(兩操作數作與運算,僅修改標志位,不回送結果).?
SHL??? 邏輯左移.
SHR??? 邏輯右移. ?
SAL??? 算術左移.(=SHL)?
SAR??? 算術右移. (左移是一樣的,右移是不同的.邏輯右移補0,算術右移補最高位)? ?
ROL??? 循環左移.? ( ((unsigned char)a) << 5 ) | ( ((unsigned char)a) >> 3 )?
????????????????? rol eax,cl ==> eax=(eax<<cl)+(eax>>(32-cl));?
ROR??? 循環右移.? ror eax,cl ==> eax=(eax>>cl)+(eax<<(32-cl));
RCL??? 通過進位的循環左移.?
RCR??? 通過進位的循環右移.?
以上八種移位指令,其移位次數可達255次.?
?? ?移位一次時, 可直接用操作碼.? 如 SHL AX,1.?
?? ?移位>1次時, 則由寄存器CL給出移位次數.?
?? ???? 如? MOV CL,04?
?? ??? ?SHL AX,CL?
-----------------------數據轉移指令---------------------------------
1. 通用數據傳送指令.?
?? ?MOV??? 傳送字或字節.?
?? ?MOVSX? 先符號擴展,再傳送.?
?? ?MOVZX? 先零擴展,再傳送.?
?? ?PUSH??? 把字壓入堆棧.?
?? ?POP??? 把字彈出堆棧.?
?? ?PUSHA? 把AX,CX,DX,BX,SP,BP,SI,DI依次壓入堆棧.?
?? ?POPA??? 把DI,SI,BP,SP,BX,DX,CX,AX依次彈出堆棧.?
?? ?PUSHAD? 把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次壓入堆棧.?
?? ?POPAD? 把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次彈出堆棧.?
?? ?BSWAP? 交換32位寄存器里字節的順序?
?? ?XCHG??? 交換字或字節.( 至少有一個操作數為寄存器,段寄存器不可作為操作數)?
?? ?CMPXCHG 比較并交換操作數.( 第二個操作數必須為累加器AL/AX/EAX )?
?? ?XADD??? 先交換再累加.( 結果在第一個操作數里 )?
?? ?XLAT??? 字節查表轉換.?
?? ??? ?── BX 指向一張 256 字節的表的起點, AL 為表的索引值 (0-255,即 0-FFH); 返回 AL??????? ?
?????? 為查表結果. ( [BX+AL]->AL )?
2. 輸入輸出端口傳送指令.?
?? ?IN????? I/O端口輸入. ( 語法: IN 累加器, {端口號│DX} )?
?? ?OUT??? I/O端口輸出. ( 語法: OUT {端口號│DX},累加器 )?
?? ??? ?輸入輸出端口由立即方式指定時, 其范圍是 0-255; 由寄存器 DX 指定時,?
?? ??? ?其范圍是 0-65535.?
LEA??? 裝入有效地址.? 例: LEA DX,string? ;把偏移地址存到DX.?
LDS??? 傳送目標指針,把指針內容裝入DS. 例: LDS SI,string? ;把段地址:偏移地址存到DS:SI.?
LES??? 傳送目標指針,把指針內容裝入ES. 例: LES DI,string? ;把段地址:偏移地址存到ES:DI.?
LFS??? 傳送目標指針,把指針內容裝入FS. 例: LFS DI,string? ;把段地址:偏移地址存到FS:DI.?
LGS??? 傳送目標指針,把指針內容裝入GS. 例: LGS DI,string? ;把段地址:偏移地址存到GS:DI.?
LSS??? 傳送目標指針,把指針內容裝入SS. 例: LSS DI,string? ;把段地址:偏移地址存到SS:DI.?
----------------------- 標志傳送指令-----------------------?
LAHF??? 標志寄存器傳送,把標志裝入AH.?
SAHF??? 標志寄存器傳送,把AH內容裝入標志寄存器.?
PUSHF?? 標志入棧.?
POPF??? 標志出棧.?
PUSHD?? 32位標志入棧.?
POPD??? 32位標志出棧.?
0012F618? |00A8E5A8? ASCII "nk'MHBh30"
-----------------------程序轉移指令 -----------------------
1>無條件轉移指令 (長轉移)?
?? ?JMP??? 無條件轉移指令?
?? ?CALL??? 過程調用?
?? ?RET/RETF過程返回.?
2>條件轉移指令 (短轉移,-128到+127的距離內)?
?? ?( 當且僅當(SF XOR OF)=1時,OP1<OP2 )?
?? ?JA/JNBE 不小于或不等于時轉移.?
?? ?JAE/JNB 大于或等于轉移.?
?? ?JB/JNAE 小于轉移.?
?? ?JBE/JNA 小于或等于轉移.?
?? ??? ?以上四條,測試無符號整數運算的結果(標志C和Z).?
?? ?JG/JNLE 大于轉移.?
?? ?JGE/JNL 大于或等于轉移.?
?? ?JL/JNGE 小于轉移.?
?? ?JLE/JNG 小于或等于轉移.?
?? ??? ?以上四條,測試帶符號整數運算的結果(標志S,O和Z).?
?? ?JE/JZ? 等于轉移.?
?? ?JNE/JNZ 不等于時轉移.?
?? ?JC????? 有進位時轉移.?
?? ?JNC??? 無進位時轉移.?
?? ?JNO??? 不溢出時轉移.?
?? ?JNP/JPO 奇偶性為奇數時轉移.?
?? ?JNS??? 符號位為 "0" 時轉移.?
?? ?JO????? 溢出轉移.?
?? ?JP/JPE? 奇偶性為偶數時轉移.?
?? ?JS????? 符號位為 "1" 時轉移.?
3>循環控制指令(短轉移)?
?? ?LOOP??????????? CX不為零時循環.?
?? ?LOOPE/LOOPZ??? CX不為零且標志Z=1時循環.?
?? ?LOOPNE/LOOPNZ? CX不為零且標志Z=0時循環.?
?? ?JCXZ??????????? CX為零時轉移.?
?? ?JECXZ????????? ECX為零時轉移.?
4>中斷指令?
?? ?INT??? 中斷指令?
?? ?INTO??? 溢出中斷?
?? ?IRET??? 中斷返回?
5>處理器控制指令?
?? ?HLT??? 處理器暫停, 直到出現中斷或復位信號才繼續.?
?? ?WAIT??? 當芯片引線TEST為高電平時使CPU進入等待狀態.?
?? ?ESC??? 轉換到外處理器.?
?? ?LOCK??? 封鎖總線.?
?? ?NOP??? 空操作.?
?? ?STC??? 置進位標志位.?
?? ?CLC??? 清進位標志位.?
?? ?CMC??? 進位標志取反.?
?? ?STD??? 置方向標志位.?
?? ?CLD??? 清方向標志位.?
?? ?STI??? 置中斷允許位.?
?? ?CLI??? 清中斷允許位.?
-----------------------串指令-----------------------
DS:SI?? 源串段寄存器? :串變址.?
ES:DI?? 目標串段寄存器:串變址.?
CX????? 重復次數計數器.?
AL/AX?? 掃描值.?
D標志?? 0表示重復操作中SI和DI應自動增量; 1表示應自動減量.?
Z標志?? 用來控制掃描或比較操作的結束.?
cld? 將DF置為0
std? 將DF置為1
MOVS??? 串傳送.?
??? ( MOVSB? 傳送字符。將ds:si指向的內存單元中的字節送入es:di中,然后根據DF的標志將si和di的值增或減(0增1減)
????? MOVSW? 傳送字。? 將ds:si指向的內存單元中的字節送入es:di中,然后根據DF的標志將si和di的值增或減(0增1減)?
????? MOVSD? 傳送雙字. ) 經常這么用rep movsb相當于s:movsb ; loop s
CMPS??? 串比較.?
??? ( CMPSB? 比較字符.??? CMPSW? 比較字. )?
SCAS??? 串掃描. 把AL或AX的內容與目標串作比較,比較結果反映在標志位.?
LODS??? 裝入串. 把源串中的元素(字或字節)逐一裝入AL或AX中.?
??? ( LODSB? 傳送字符.??? LODSW? 傳送字.??? LODSD? 傳送雙字. )?
STOS??? 保存串.是LODS的逆過程.?
REP??????????? 當CX/ECX<>0時重復.?
REPE/REPZ????? 當ZF=1或比較結果相等,且CX/ECX<>0時重復.?
REPNE/REPNZ??? 當ZF=0或比較結果不相等,且CX/ECX<>0時重復.?
REPC?????????? 當CF=1且CX/ECX<>0時重復.?
REPNC????????? 當CF=0且CX/ECX<>0時重復.?
-----------------------偽指令-----------------------
DW????? 定義字(2字節).?
PROC??? 定義過程.?
ENDP??? 過程結束.?
SEGMENT 定義段.?
ASSUME? 建立段寄存器尋址.?
ENDS??? 段結束.?
END??? 程序結束. ? 創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎
總結
以上是生活随笔為你收集整理的win32汇编指令汇总的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux 内核调试器 调试指南
- 下一篇: 264 解码之 yuv