[Video] Comparing C to machine language
条评论Conclusion
Comparing C to machine language
简单理解
cmpl和jl如何判断大小有兴趣可以再去了解下这几个标志位,以及对于有无符号整数,是怎么利用这几个标志位来做大小、溢出比较的。
关键标志位
cmpl会设置以下标志位(用result = dest - src解释):标志位 名称 触发条件(何时为 1) 用途 ZF 零标志 result == 0(两数相等)判断是否相等 SF 符号标志 result < 0(结果为负)判断有符号数的符号 OF 溢出标志 结果溢出(有符号数的正负意外翻转) 辅助判断有符号数的比较 CF 进位标志 dest < src(无符号比较)判断无符号数的大小
对比其他跳转指令
指令 含义 判断条件 比较类型 jlJump if Less SF != OF有符号 jgJump if Greater ZF=0 && SF=OF有符号 jbJump if Below CF=1无符号 jaJump if Above CF=0 && ZF=0无符号
一句话总结
cmpl A, B:计算B - A,设标志位。jl:若B < A(有符号数),则跳转。(实际是检查SF != OF,涵盖溢出情况。)
ABI 参数传递规则
- x86-64 System V ABI 的参数传递规则:
- 整数/指针参数:前 6 个参数依次通过
%rdi,%rsi,%rdx,%rcx,%r8,%r9传递。 - 浮点参数:前 8 个参数通过
%xmm0~%xmm7传递。 - 多余参数:从第 7 个参数开始,从右到左压栈(即最后一个参数先入栈)。
ABI 规则和编译器优化
- 编译器在生成汇编时,并不严格按源码顺序填充寄存器;
- 关键点:ABI 只要求函数调用时寄存器和栈中的参数值是正确的,不关心指令顺序。
Analysis
1 |
|
1 | Disassembly of section .text: |
本文标题:[Video] Comparing C to machine language
文章作者:Henry Wu
发布时间:2025-04-28
最后更新:2025-11-13
原始链接:https://henrywu.netlify.app/2025/04/28/compare-c-to-machine-language/
版权声明:转载请注明出处。CC BY-NC-SA 4.0
