滴水汇编第七天
本帖最后由 Insist_2020 于 2021-7-25 12:31 编辑转移指令(JCC)
1.JMP指令:无条件转移指令(修改EIP的值)
<1>16位CPU的JMP指令的分类:
jmp short 标号 功能为:段内短转移 (IP)=(IP)+8位位移
(1)8位位移=标号处的地址-jmp指令后的第一个字节地址
(2)short指明的此处是8位位移
(3)8位位移的范围为-128-127,用补码表示
(4)8位位移是编译程序时在编译时算出的
jmp near ptr 标号 功能为:段内近转移 (IP)=(IP)+16位位移
(1)16位位移=标号处的地址-jmp指令后的第一个字节地址
(2)near指明的此处是16位位移
(3)16位位移的范围为-32768-32767,用补码表示
(4)16位位移是编译程序时在编译时算出的
jmp far ptr 标号 功能为:段间转移,far ptr指明了用标号的段地址(CS)和偏移地址(IP)
(1)修改CS:IP,让cpu指向目的地址,这是直接给出目的地址,不是根据位移
<2>32位CPU的JMP指令的分类:
(1)near,short与16位的本质相同
jmp far ptr 标号
(1)32位位移=标号处的地址-jmp指令后的第一个字节地址
(2)far指明的此处是32位位移
(3)32位位移的范围为-2147483648-2147483647(0x80000000-0x7FFFFFFF),用补码表示
(4)32位位移是编译程序时在编译时算出的
<3>CPU执行指令的过程
(1)从EIP处向内存单元读取指令,指令进入缓冲区
(2)EIP=EIP+指令的长度,CPU指向下一条指令
(3)执行指令,重复步骤1继续循环
<4>JMP指令的格式:
(1) JMP 寄存器/立即数/内存地址==> MOV EIP,寄存器/立即数/内存地址
2.CALL/RET指令:共同用来实现子程序的设计
(1)CALL 地址A/寄存器 ==> PUSH 当前EIP(CALL下一条指令的地址;不理解可以查看上面的CPU执行指令的过程)
MOV EIP,地址A/寄存器 ==> JMP 地址A/寄存器 (CALL指令实现转移的方法和jmp指令的原理相同)
(2) RET ==>LEA ESP,==> POP EIP
MOV EIP, ==> JMP
2.CMP/TEST指令
<1>CMP指令:该指令是比较两个操作数,实际上,它相当于SUB指令,但是相减的结构并不保存到第一个操作数中。
只是根据相减的结果来改变零标志位的(AF CF OF PF SF ZF)当两个操作数相等的时候,ZF标志位置1。指令格式:CMPR/M,R/M/IMM
(1) CMP 寄存器,寄存器:两个寄存器数据宽度必须一致
(2) CMP 寄存器,立即数:寄存器宽度与立即数的数据宽度必须一致
(2) CMP 寄存器,内存:寄存器宽度与内存宽度必须一致
<2>TEST指令:该指令在一定程序上和CMP指令时类似的,两个数值进行与操作,结果不保存,但是会改变相应标志位(CF OF PF SF ZF)。指令格式:TESTR/M,R/M/IMM
(1)常见用法:用这个指令,可以确定某寄存器是否等于0。例如:TEST EAX,EAX(观察Z位)
2.JCC指令:指条件跳转指令,CC就是指条件码
<1>JE/JZ指令:结果为零则跳转(相等时跳转);ZF=1
<2>JNE/JNZ指令:结果不为零则跳转(不相等时跳转);ZF=0
<3>JS指令:结果为负则跳转;SF=1
<4>JNS指令:结果为非负则跳转;SF=0
<5>JPE/JP指令:结果最低字节中1的个数为偶数则跳转 ;PF=1
<6>JNP/JPO指令:结果最低字节中1的个数不为偶数则跳转;PF=0
<7>JO指令:结果溢出了则跳转;OF=1
<8>JNO指令:结果没有溢出则跳转;OF=0
<9>JB/JNAE指令:小于则跳转 (无符号数);CF=1
<10>JAE/JNB指令:大于等于则跳转 (无符号数);CF=0
<11>JBE/JNA指令:小于等于则跳转 (无符号数);CF=1 or ZF=1
<12>JA/JNBE指令:大于则跳转(无符号数);CF=0 and ZF=0
<13>JL/JNGE指令:小于则跳转 (有符号数);SF≠ OF
<14>JNL/JGE指令:大于等于则跳转 (有符号数);SF=OF
<15>JLE/JNG指令:小于等于则跳转 (有符号数);ZF=1 or SF≠ OF
<16>JG/JNLE指令:大于则跳转(有符号数);ZF=0 and SF=OF
都忘的差不多了:rggrg 有点熟悉 一看汇编就像是回来了远古时代,上世纪90年代,现在的硬件(CPU,内存,主板)技术已经革新了好几代,软件也更新了几个大版本,x64 已经成为主流计算机平台,我个人认为,随便折腾点新技术,总比去啃古老技术要容易,找工作或是玩技术,个人兴趣爱好另外别论 EnterpriseSolu 发表于 2021-7-14 07:34
一看汇编就像是回来了远古时代,上世纪90年代,现在的硬件(CPU,内存,主板)技术已经革新了好几代,软件也 ...
API调用大师?不去学底层,学得明白? 感谢分享滴水这个名字起的好,水滴石穿,学无止境 看不懂、、、 这个学的人越来越少了,学破解的,必须
页:
[1]
2