当前位置: 代码迷 >> 汇编语言 >> 是不是每个汇编指令多有自己对应的二进制代码呀?解决办法
  详细解决方案

是不是每个汇编指令多有自己对应的二进制代码呀?解决办法

热度:7096   发布时间:2013-02-26 00:00:00.0
是不是每个汇编指令多有自己对应的二进制代码呀?

00462CEF: 83 C4 18 ADD ESP,18

00462D01: 83 C6 0F ADD ESI,0F

00462D3F: 83 C4 14 ADD ESP,14

00462D57: 83 C6 0F ADD ESI,0F

像上面第一行 83代表add C4代表esp 18代表18  
是不是每个指令自己多有对应的二进制(十六进制)代码呀
还是怎么样呢??



00462C5D: E8 5F FF FF FF CALL 00462BC1
00462C62: 59 POP ECX
00462C63: E9 6F 01 00 00 JMP 00462DD7

像这些代码 最后一行“E9 6F 01 00 00 ”和“JMP 00462DD7” 根本不是一一对应嘛~~

好难理解哟



------解决方案--------------------------------------------------------
承蒙提示,敝人认真滴看了所谓的INTEL官方文档。但是,发现和你说的不太符合。
首先,相对短转移,用的是8位相对偏移量,这个与你所说符合;
其次,16位相对近转移,用的是相对偏移量,这个与你所说符合;
再次,32位相对近转移,用的是相对偏移量,这个与你所说符合;
第四,16位直接远转移,用的是绝对地址,你没说。如jmp 0x2000:0x5500
第五,32位直接远转移,用的是绝对地址,你也没说。如jmp 0x2000:0x6000000
第六,16位间接绝对近转移,用的是绝对地址,你也没说。如jmp cx或者jmp near [bx]
第七,32位间接绝对近转移,用的是绝对地址,你也没说。如jmp ecx或者jmp near [ecx]
第八,16或32位间接绝对远转移,用的是绝对地址,你也没说。如jmp far [5]

探讨
楼主,对于JMP的机器码是跟跳转的类型是密切相关的
短跳转和近跳转指令中包含的操作数都是相对于EIP的偏移,而远跳转指令中包含的是目标的绝对地址,所以短/近跳转会出现跳至同一目标的指令机器码不同。而远跳转中包含的是绝对地址,因此转移到同一地址的指令机器码相同,如果要了解更多,楼主可以参考Intel的官方文档的第一卷。有关opcode的信息
  相关解决方案