2014-06-23 3 views
1

В настоящее время я пытаюсь умножить два поплавка, один из которых поступает из вектора float (адрес хранится в ebx) и против значения, которое я сохранил в ecx.Как перенести результат mul из двух поплавков в сборку x86?

Я подтвердил, что входные значения верны, однако, если я умножаю 32 и 1, например, значение в EAX изменяется на 00000000, а значение EDX - на 105F0000. Из моего понимания MUL это происходит потому, что он хранит бит высокого порядка результата в EDX и младших порядках в EDX. Вопрос в том, как перенести результат в выходную переменную (returnValue)? Вот фрагмент кода, о котором идет речь:

AddColumnsIteration: 
    cmp esi, 4 // If we finished storing the data 
    jge NextColumn // Move to the next column 
    mov eax, [ebx][esi * SIZEOF_INT] // Get the current column 
    mul ecx // Multiply it by tx 
    add [returnValue][esi * SIZEOF_INT], eax // Add the data pointed at by eax to the running total 
    inc esi // Element x, y, z, or w of a Vec4 
    jmp AddColumnsIteration // Go back to check our loop condition 

Я знаю, что если я использовал X87 команды или инструкции SSE, это было бы на порядок проще, но сдерживает задачи требуют чистого кода x86 сборки. Извините, если это кажется простым, но я все еще изучаю идиосинкразии сборки.

Заранее спасибо за помощь и иметь хороший день

+0

Я понятия не имею, что вызвало отрицательный рейтинг –

+1

Сначала проверьте, работает ли ваш код! mul, кажется, отсутствует операнд. И вы пытаетесь использовать целочисленную арифметику без какого-либо декодирования и кодирования значений с плавающей запятой (неверно). Для вывода, как ваша среда C++ хочет этого? У вас может быть выходной адрес тоже, или если операция «* =», , затем перезаписать старый объект или с перемасштабированным. – user877329

+0

MUL не является операндом, он принимает любое значение, которое вы ему даете, и умножает значение, хранящееся в EAX. Что значит кодирование или декодирование значений с плавающей запятой (как я уже сказал, я новичок в сборке)? Результат выводится в Vec4, просто структура с 4 поплавками, все инициализируются до нуля. Таким образом, в основном код умножает матрицу 4x4 на вектор 4x1 и сохраняет ее на выходе Vec4. –

ответ

5

Вы умножая представления чисел с плавающей точкой в ​​виде целых чисел, а не сами чисел с плавающей точкой:

1.0 = 0x3f800000 
32.0 = 0x42000000 

     0x3f800000 * 0x42000000 = 0x105f000000000000 

Чтобы выполнить арифметику с плавающей запятой, вам необходимо выполнить одно из следующих действий:

  • Использовать x87.
  • Использование SSE.
  • Напишите свое собственное умножение программного обеспечения, которое разделяет кодировки на знак, экспоненту и значение, xors знаки для получения знакового бита продукта, добавляет экспоненты и корректирует смещение, чтобы получить показатель экспоненты продукта, умножает знамена и раундов, чтобы получить значимость продукта, а затем собирает их для получения результата.

Очевидно, что первые два варианта намного проще, но это звучит как они не являются вариантом для той или иной причине (хотя я не могу себе представить, почему нет, x87 и SSE являются «чистый x86 ассемблерный код ", поскольку они были частью ISA в течение очень долгого времени).

+0

Я не писал это как ответ, потому что вопрос состоял в том, как вернуть вектор, но стоит одного голоса, так как опубликованное неверно. x87 работает в 486DX, поэтому для x87, да, его чистая сборка x86. – user877329

+0

Да; к сожалению, не имеет смысла даже говорить о том, как сохранить результат, пока собеседник не сможет успешно вычислить результат для хранения. –

Смежные вопросы