c - 负值与 rdi 寄存器的比较结果不正确
问题描述
我有一个 C 64 位程序,其函数声明如下所示:
#include <stdio.h>
extern double wartosc (double a, double b, double x, int n);
int main() {
printf("%f", wartosc(4, 3, 2, -2));
}
该函数在汇编程序中实现,代码:
section .text
global _wartosc
_wartosc:
cmp rdi, 0
jl finish
xorpd xmm0, xmm0
finish:
ret
为什么 printf 函数输出 0?比较反对 rdi 寄存器的论点似乎是无效的
如果我理解正确,参数 a、b、x 被传递给 xmm0、xmm1 和 xmm2 寄存器并且最后一个参数在 rdi 中,结果由 xmm0 寄存器返回。
解决方案
您将参数声明为int
32 位类型。它没有符号扩展为 fill rdi
,只有edi
。
RDI 的上半部分是调用者留下的任何随机垃圾。在许多情况下为零,来自写入 32 位寄存器后的隐式符号扩展。
查看编译器为调用者生成的代码,并查看调试器中的寄存器值。
推荐阅读
- unity3d - 多场景编辑:游戏窗口显示非活动场景
- html - Flexbox justify-content 不起作用(孩子右侧的奇怪额外边距)
- xml - 编辑 solrconfig.xml 的最简单方法是什么?
- android - firebase signInWithCustomToken 不起作用
- javascript - 将字符串转换为分隔对象键
- javascript - 最大子对象 React-native
- c++ - 初始化 constexpr -“用非常量表达式非法初始化 'constexpr' 实体”
- node.js - Knex 从时间列和日期列中获取格式化时间
- java - 无法在 JPanel Java 中编辑文本区域
- reactjs - 容器中的 React 组件和 redux 的表示组件的正确分离