速記方法:
b(below,無符號)
匯編指令x86下 指令+目的操作數+原操作數 比較是用目的操作數去和原操作數比較
jz loc 當cmp的兩個值相等的時候跳轉,否則繼續履行下1條
jnz loc 當cmp的兩個值不相等的時候跳轉,否則繼續履行下1條
je loc 當cmp的兩個值相等的時候跳轉,否則繼續履行下1條
jne loc 當cmp的兩個值不相等的時候跳轉,否則繼續履行下1條
jg loc (cmp eax,ebx)當eax大于ebx時履行跳轉,否則繼續履行下1條
jge loc (cmp eax,ebx)當eax大于或等于(不小于)ebx時履行跳轉,否則繼續履行下1條
ja loc ja=jg 不過是無符號數比較
jae loc jae = jge 不過是無符號數比較
jl loc (cmp eax,ebx)當eax小于ebx時履行跳轉,否則繼續履行下1條
jle loc (cmp eax,ebx)當目的操作數小于或等于原操作數時,跳轉,否則履行下1條
jb loc 和 jl 1樣,不過是無符號的比較
jbe loc 和jle1樣,不過是無符號數的比較
后面兩個不怎樣經常使用,但是記錄1下吧:
jo loc 如果上1條指令履行后(of=1),則跳轉(溢出跳轉)
js loc 如果符號位被置位(sf=1),則跳轉
jecxz loc (jmp if ecx = 0)
這里說的重復指令是對字符串數組的操作。字符串數組操作的最小原子步驟1般為:
movsx,cmpsx,stosx,scasx
,x則可以是b(byte),w(word),d(dword)
,這1部份會在后面細講。
使用這些操作時,用esi(source addr)
充當源地址,edi(destination addr)
充當目的地址。
由于字符串的比較和移動,需要對長度作以限制,所以需要1個長度參數,1般用ecx
來計數。
重復指令用rep
來表示,終止條件為:
REP/REPE/REPNE
The string instructions may be prefixed by REP/REPE/REPNE which will repeat the
instructions according to the following conditions:rep decrement cx ; repeat if cx is not zero repe decrement cx ; repeat if cx not zero AND zf = 1 repz decrement cx ; repeat if cx not zero AND zf = 1 repne decrement cx ; repeat if cx not zero AND zf = 0 repnz decrement cx ; repeat if cx not zero AND zf = 0
Here, ‘e’ stands for equal, ‘z’ is zero and ‘n’ is not. These repeat instructions
should NEVER be used with a segment override, since the 8086 will forget the
override if a hardware interrupt occurs in the middle of the REP loop.
在x86下,使用重復前綴來做多字節操作,rep
會增加esi 和edi
這兩個偏移,并且同時減少ecx
的值,rep前綴會不斷重復,直到終止條件到來。因此,需要在使用前初始化esi,edi,ecx
。
esi
指向的地址中獲得1個字節,并寄存到edi
中(需要用df方向標志來肯定移動方向,esi+1,edi+1或esi⑴,edi⑴)memcmp
)scasb
用于從字符串中搜索1個值,這個值由al
指出,所以需要初始化al
。注意,不是用esi
和edi
比較,尋覓到的位置會寄存到esi
中。edi
指向的地址。(memset
)rep指令的經常使用組合
esi
和edi
指向的字符串,當字符串不同或ecx=0的時候停止edi
包括了緩沖區地址,al
則包括了初始值。esi
指向的字符串復制到edi
中,長度為ecx
。(單字節復制,rep加偏移1,ecx表示重復次數)edi
中搜索單字節(al
),并將結果放在esi
中,ecx
為緩沖區長度。movsb需要指定兩個字符串,esi and edi
.
stosb只需要指定edi
,要復制的是單個字節,由al
給定。
歹意代碼分析實戰P74⑺6
指令集查詢