Неверный результат сравнения отрицательного значения с регистром rdi - PullRequest
0 голосов
/ 17 ноября 2018

У меня есть 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.

1 Ответ

0 голосов
/ 17 ноября 2018

Вы объявили параметр как int, который является 32-битным типом .Это не расширение знака для заполнения rdi, только edi.

Верхняя половина RDI - это любой случайный мусор, оставленный вызывающей стороной.Во многих случаях ноль, из неявного расширения знака после записи 32-битного регистра.

Посмотрите на сгенерированный компилятором код для вызывающего и посмотрите значения регистров в отладчике.

...