外贸网站建设规划,wordpress 导入 乱码,平面设计培训怎么样,建筑行业综合查询平台最近看链接器源码中#xff0c;对位置无关代码PIC(共享库)的链接问题#xff0c;发现对call和jmp很多不常用的用法#xff0c;这里试验并总结了一下各种用法。我们最常用的jmp形式#xff0c;就是 jmp后面跟个标签#xff01;这个没什么可说的#xff01;假如标签叫做myl…最近看链接器源码中对位置无关代码PIC(共享库)的链接问题发现对call和jmp很多不常用的用法这里试验并总结了一下各种用法。我们最常用的jmp形式就是 jmp后面跟个标签这个没什么可说的假如标签叫做mylabel它的地址是0x8048377而且有个全局变量bb存储的内容就是mylabel的地址而b的地址是0x80494A8。即有这样的赋值(加载)语句movl$mylabel,%eax//把mylabel的地址加载到eax寄存器中movl%eax,b//把mylabel的地址加载到b中movl$b,%ebx//把b的地址加载到ebx寄存器中我们考虑下面的语句1.jmpmylable2.jmp0x80483773.jmp%eax4.jmp*%eax5.jmp*(%ebx)6.jmp*0x80494A87.jmp*b8.jmp$0x5这7句jmp语句分别都做了什么1.不用说跳转到mylabel标签处继续执行代码但是是如何跳转的呢就是PC加上了mylabel标签处对于jmp处的一个偏移地址可执行的二进制代码是这样表示的eb 03就是说pc0x03就可以了。2.这里0x8048377是mylabel的地址我以前研究过标签的作用更他的地址的作用是等效的。所以这里的执行效果跟1中的相同。但是还有些不一样这里的二进制代码成了e9 03 00 00 00 这里用了32位表示了这个偏移而在1中只用了8位3.在编译链接的时候这句代码会有警告warning:indirect jmp without *。间接跳转没有‘*’符号但是执行起来还是没有错。看一下二进制的可执行文件的代码发现给补上了个‘*’号而且二进制是ff e0.4.其实4是3的补充版正常的形式就是4而三是有警告的被补充的版本。5.%ebx是b的地址那么(%ebx)表示ebx的值为地址指向的地方。这里指向了b的内容也就是mylabel的地址于是化简后5也就等效与2但是二进制表示是ff 23。6.0x80494A8是b的地址这里看做内存数那么实质上b指向的值是mylabel的地址于是化简后同2二进制代码是ff 25 a8 94 04 08。7.b是标签代表一个地址所以这里同6二进制代码也同68.这句话是错误的jmp不支持立即数所以说正确的写法有1.jmpmylable//eb 032.jmp0x8048377//e9 03 00 00 003.jmp*%eax//ff e04.jmp*(%ebx)//ff 235.jmp*0x80494A8//ff 25 a8 94 04 086.jmp*b//ff 25 a8 94 04 081和2叫做间接寻址就是算偏移量的。后面没有‘*’号而是直接一个标签或者地址(标签就可以看做是地址)所以说就是一个直接的地址的值。间接跳转的二进制代码是eb或者e9是e开头的。3456叫做直接寻址直接寻址的标识就是这个‘*’号直接寻址就是PC直接赋值某个地址而不是加偏移量。所以‘*’号后面的部分其实是一个要付给PC的值那么取值的方式就好想象了直接跳转的二进制代码是ff开头的。3是寄存器直接取值4是寄存器间接取值5是内存数取值6是标签取值(实质上同5)。确实有点意思~call同jmp指令