汇编JCC学习
1.JMP指令:修改EIP的值(只修改了EIP的值,寄存器以及堆栈都没有改变)
mov eip,寄存器/立即数 简写为 JMP 寄存器/立即数
2.Call指令:(修改了EIP的值,[ESP-4],把返回地址的值(当前地址+指令所占字节)压栈)
push 地址B
mov eip,地址A/寄存器 简写为:CALL 地址A/寄存器
3.RET指令:(相当于pop eip)
lea esp,[esp+4]
mov eip,[esp-4] 简写为:RET
4.CMP指令: 格式:CMP R/M,R/M/IMM (只修改标志寄存器的值)(加入SF=1了,一定是因为第一个操作数比第二个操作数小了,因为相减位负数,最高位为1)
该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。
只是根据相减的结果来改变零标志位的,当两个操作数相等的时候,零标志位置1。
MOV EAX,100
MOV ECX,100
CMP EAX,ECX 观察Z位
MOV EAX,100
MOV ECX,200
CMP EAX,ECX 观察S位
CMP AX,WORD PTR DS:[405000]
CMP AL,BYTE PTR DS:[405000]
CMP EAX,DWORD PTR DS:[405000]
5.TEST指令: (判断某一个寄存器是否为空,TEST EAX,EAX)
指令格式:TEST R/M,R/M/IMM
该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位.
与的操作表项如下:
1 and 1 = 1
1 and 0 = 0
0 and 1 = 0
0 and 0 = 0
常见用法:用这个指令,可以确定某寄存器是否等于0。
TEST EAX,EAX 观察Z位
但是如果EAX的二进制某些位为1的话,那么运算的结果就不为零。
6. JE(两个操作数相等), JZ 结果为零则跳转(相等时跳转) ZF=1
7. JNE, JNZ 结果不为零则跳转(不相等时跳转) ZF=0
8、 JS 结果为负则跳转 SF=1
9、 JNS 结果为非负则跳转 SF=0
10、 JP, JPE 结果(低8位)中1的个数为偶数则跳转 PF=1
11、 JNP, JPO 结果中1的个数为非偶数则跳转 PF=0
12、 JO 结果溢出了则跳转 OF=1
13、 JNO 结果没有溢出则跳转 OF=0
14、 JB, JNAE 小于则跳转 (无符号数) CF=1
15、 JNB, JAE 大于等于则跳转 (无符号数) CF=0
16、 JBE, JNA 小于等于则跳转 (无符号数) CF=1 or ZF=1
17、 JNBE, JA 大于则跳转(无符号数) CF=0 and ZF=0
18、 JL, JNGE 小于则跳转 (有符号数) SF≠ OF
19、 JNL, JGE 大于等于则跳转 (有符号数) SF=OF
20、 JLE, JNG 小于等于则跳转 (有符号数) ZF=1 or SF≠ OF
21、 JNLE, JG 大于则跳转(有符号数) ZF=0 and SF=OF
有符号无符号的区别:
CMP AL,CL
JG 0x12345678
JA 0x12345678