сборка x86 nasm, выводящая значения с плавающей точкой - PullRequest
1 голос
/ 23 февраля 2012

Я работаю над проектом, и мне нужно вывести значения с плавающей запятой, используя printf из C.

Я могу распечатать значения прямо сейчас, но я не совсем уверенкак происходит печать.

Для печати значений int я просто нажимаю тип данных и местоположение, и он печатается нормально.

Но для float это совсем другая история.

Вот код для печати чисел с плавающей запятой

mov qword rdi, float_format                          
push qword 0                                         
push r14                                            
movsd xmm0, [rsp]                                    
mov qword rax, 1                                     
call printf                                          
pop rax                                               
pop rax

, который будет эффективно выводить значение, введенное с клавиатуры. Однако, когда я манипулирую числом с помощью команд с плавающей запятой, например fadd или fdivдля того, чтобы распечатать, перед вызовом функции печати с плавающей точкой мне нужно mov 1, rax

Идеи? Чтобы упростить? Или объяснение, почему я использую xmm0?

1 Ответ

1 голос
/ 24 февраля 2012

Вам необходимо знать используемые соглашения о вызовах.Linux на AMD64 использует System V AMD64 ABI .Из этого документа мы узнаем, что:

  • целочисленные аргументы передаются в rdi, rsi, rdx, rcx, r8 и r9
  • числа с плавающей точкой передаются от xmm0 до xmm7
  • для функций varargs количество используемых регистров SSE заносится в rax

Так что для вызова

printf (format, float_value)

у вас есть rdi = формат, xmm0 = float_value и rax = 1.

...