再看汇编和机器码
先看代码:
这里为了排版方便用的图片,也有行号,说明如下:
1. 80386的部分机器码如下:
其中 imm表示立即数 DDD表示用3位表示的目的寄存器标号, SSS表示用3位表示的源寄存器标号
机器码中将寄存器用三位表示,例如EDX: 010 EAX: 000 ECX: 001
因此,图中第三行代码: MOV EDX, 0 翻译成机器码:
1 表中第二行符合指令形式, 10 111 DDD
2 指令中的目的寄存器标号为:010,带入 10 111 010, 也就是: 1011 1010 = BA,因此,指令和目的寄存器的内容就是BA
3 用32位寄存器表示立即数,因此立即数0被表示成 00 00 00 00, 所以除了第三行的 BA 后的 00 后,第4,5行的00就是这么来的
4 理解了3,4,5行代码后,再理解24,25,26的代码就简单多了,1被表示成 01 00 00 00 因为intle cpu是小端模式,也就是说高位存低字节的内容
5 再来看跳转, 这里的跳转是相对地址,也就是说计算跳转后地址和跳转前地址的差值填写到跳转指令之后,
6 以第14行为例:jns NXT 符合表中的JNS部分,表中的是立即数,这里的标号就是立即数而已,跳转指令执行后的地址是19H,跳转的地址是1DH,还要经过4H个字节,因此OF 89后的立即数是: 04 00 00 00
7 同样第11行为例:jz GCD 符合表中的JZ部分,表中的是立即数,这里的标号就是立即数而已,跳转指令执行后的地址是13H,跳转的地址是24H,还要经过11H个字节,因此OF 84后的立即数是: 11 00 00 00
8 第20行为例:jmp ORD 符合表中的JMP部分,表中的是立即数,这里的标号就是立即数而已,跳转指令执行后的地址是24H,跳转的地址是BH,还要经过-16H个字节,因此E9后的立即数是-16H的补码: E7 FF FF FF
其他的应该都是很简单的,自己就可以阅读了吧。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
2022-12-27 C语言中使用数学函数