《解析CPU中的寄存器.docx》由会员分享,可在线阅读,更多相关《解析CPU中的寄存器.docx(15页珍藏版)》请在第一文库网上搜索。
1、解析CPU中的寄存器寄存器存储CPU中的数据32位通用寄存器32位16位8位EAXAXA1ECXCXC1EDXDXD1EBXBXB1ESPSPAHEBPBPCHESISIDHEDIDIBH8位寄存器在16位寄存器中,而16位寄存器在32位寄存器中。简单来说32位寄存器就是一整个16位寄存器就是32的一半15-0这部分8位寄存器分高位和低位,分别代表1587-0,如下图做个实验就明白了将32位寄存器全部写满数据对16位寄存器调试可以看到更改的数据是后面四个对8位高低寄存器调试,可以看到ah是在eax寄存器的后34位改变的,a1是后两位改变的Od添加两个指令f8执行,eax的值变成了1又把eax的
2、值给了edx内存写立即数到内存movbyteptrds:内存窗口的已申请的16进制,Ibyteworddword字节大小InoVbyteptrds:0019FB90,20写寄存器到内存movbyteptrds:0019FB90,eax读内存到寄存器moveax,byteptrds:0019FB90内存地址的五种表示方式形式1立即数0019FB90形式2reg代表任意寄存器形式3rcg+立即数形式4reg+reg*1,2,4,8形式5reg+reg*1,2,4,8+立即数数据的存储模式大段模式:数据高位在低位,数据地位在高位小段模式:数据低位在低位,数据高位在高位db内存地址查看一个字节dw内存
3、地址查看两个字节dd内存地址查看四个字节大小端的使用场景1、Ini止的80X86系列芯片使用小端存储模式2、ARM芯片默认采用小端,但可以切换为大端3、M1PS芯片采用大端,但可以在大小端之间切换4、在网络上传输的数据普遍采用的都是大端0x1122334411是高位44是低位在内存地址中9093内存地址,所以是小段模式0019FF90440019FF91330019FF92220019FF9311mov移动数据moveax,1将1存储到eax中moveax,edx将edx的值存储到eaxadd数据相加addeax,1eax加1结果给eax也数据相减subeax,1eax减1结果给eaxand作
4、用按位与运算按位与作用:只将某一位变成0,而其他位保持不变使用:谁要变0,谁就和0与and就是与运算,两个数按二进制位相与,全1为1,有。为0,常用于把低位清零or按位或运算或位用用按作使oreax.edx:只将某一位变成1,而其他位保持不变:谁要变1谁就和1或xor异或运算一样为O不一样为1xoreax,ecxnot异或运算一样为1不一样为0noteax,ecxmovs移动数据,内存内存movsbyteptres:EDI,byteptrds:ES1Jmovswordptres:EDI,wordptrds:ESImovsdwordptres:EDI,dwordptrds:ESI简写movsbm
5、ovSwmoVSdEF1标志寄存器DF的值由第十位决定为O时,则EDIESI+1+2+4为1时,则EDIESI-1-2-4stos指令将a1/ax/eax的值存储到edi指定的内存单元Stosbyteprtes:EDIstoswordprtes:EDIstosdwordprtes:EDIj写Stosbstoswstosdrep指令,按计数寄存器ECX中指定的次数重复执行字符串指令moVecx,IOrepmovsdrepstosd堆栈ESP栈指针寄存器push指令向堆栈压入数据,修改斩顶指针ESP寄存器相当于movsub-4push3pusheaxpushdwordprtds:18FF4pop指
6、令将斩顶数据存储到寄存器,修改栈顶ESP寄存器相当于movadd+4popecxpop3修改EIP指令下一次要执行的指令jmp指令跳转jmp004F11jmpIOjmpeaxca11指令修改EIP的值Can指令结束后,下一行地址存到堆栈中同时ESP的值-4ca11004F1Ica11eaxret指令把当前栈顶的值放到EIP,ESP+4ret函数指令的集合函数的调用jmp或ca11小案例两数相加OO1movecx,1002movedx,2003ca11009008addecx,edx009moveax,ecx010ret堆栈平衡如果要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在
7、ret指令之前,ESP指向的是我们压入栈中的地址。如果通过堆栈传递参数了,那么在函数执行完毕后,要平衡参数导致的堆栈变化。ESP寻址001push1002push2003ca11007004addesp,8007moveax,dwordprtss:esp+4008moveax,dwordprtss:esp+8009retEBP寻址开辟新的内存空间espebp整体移动,等函数调用结束在回到原位OO1push1002push2003ca11007004addesp,8007pushebp008movebp,esp009subesp,10010moveax,dwordptrss:ebp+8011mo
8、veax,dwordptrss:esp+C012movesp,ebp013popebp014retjcc指令标志寄存器CF第。位,表示无符号数运算的溢出状态,溢出为1,反之为0溢出了Cf为1mova1,OxFEadda1,2PF如果结果的最低有效字节包含偶数个1位,则为1,反之为0mova1,Oxceadda1,0AF如果算数操作在结果的第三位发生进位或借位则将该标志置1,否则清零ZF若结果为0,则为1,反之为0moveax,IOOmovecx,IOOcmpeax,ecxcmp与sub类似,但想减的结果并不保存到第一个操作数中testeax,ecxSF该标志被设置为有符号整型的最高有效位(0指
9、示结果为正,反之则为负)mova1,0x7Fadda1,2mova1,OxFEadda1,2OF反映有符号数加减运算所得结果是否溢出如果无符号运算,溢出看Cf位如果有符号运算,溢出看Of位mova1,0x7Fadda1,2JCC指令中文含义检查符号位JZ/JE若为O则跳转;ZF=I若相等则跳转ZF=IJNZ/JNE若不为O则跳转;ZF=O若不相等则跳转ZF=OJS若为负则跳转SF=IJNS若为正则跳转SF=OJP/JPE若1出现次数为偶数则跳转PF=IJNP/JPO若1出现次数为奇数则跳转PF=OJO若溢出则跳转OF=IJNO若无溢出则跳转OF=OJC/JB/JNAE若进位则跳转;CF=I若低
10、于则跳转;CF=I若不高于等于则跳转CF=IJNC/JNB/JAE若无进位则跳转;CF=O若不低于则跳转;CF=O若高于等于则跳转;CF=OJBE/JNA若低于等于则跳转;ZF=I或CF=I若不高于则跳转ZF=I或CF=IJNBE/JA若不低于等于则跳转;ZF=O而且CF=O若高于则跳转ZF=O而且CF=OJ1/JNGE若小于则跳转;SF1=OF若不大于等于则跳转SFI=OFJN1/JGE若不小于则跳转;SF=OF若大于等于则跳转;SF=OFJ1E/JNG若小于等于则跳转;ZF!=OF或ZF=I若不大于则跳转ZF!=OF或ZF=IJN1E/JG若不小于等于则跳转;SF=OF且ZF=O若大于则跳转SF=OF且ZF=O审核汤梓红