我遇到了使用 SSE 指令对浮点数数组执行计算的汇编代码的问题。代码应使用数组 A、B、C 和 D 的元素计算数组 E 的值,公式如下:e=(a+b)/d + c*d
当程序执行时,数组E中的结果不正确。例如,我得到的不是预期值:
E[0] = 512.000123
E[1] = 262144.063538
E[2] = 33554440.187500
E[3] = 805306499.562500
E[4] = 17179873412.000000
E[5] = 171798725768.000000
预期输出:
E[0] = 5.0
E[1] = 10.0
E[2] = 17.0
E[3] = 26.0
E[4] = 37.0
E[5] = 50.0
代码:
section .data
n equ 6 ; Количество элементов
A dd 1.0, 2.0, 3.0, 4.0, 5.0, 6.0
B dd 1.0, 1.0, 1.0, 1.0, 1.0, 1.0
C dd 2.0, 3.0, 4.0, 5.0, 6.0, 7.0
D dd 2.0, 3.0, 4.0, 5.0, 6.0, 7.0
E dd 0.0, 0.0, 0.0, 0.0, 0.0, 0.0
fmt db "E[%d] = %f", 10, 0 ; Формат для вывода
section .text
global main
extern printf
main:
push ebp
mov ebp, esp
xor ebx, ebx ; Инициализация индекса
.loop:
cmp ebx, n
jge .end_loop
; Загружаем значения
movss xmm0, [A + ebx * 4] ; A[i]
movss xmm1, [B + ebx * 4] ; B[i]
movss xmm2, [C + ebx * 4] ; C[i]
movss xmm3, [D + ebx * 4] ; D[i]
; Вычисление E[i] = C[i] * D[i] + (A[i] + B[i]) / D[i]
addss xmm0, xmm1 ; xmm0 = A[i] + B[i]
; Проверка на деление на ноль для D[i]
movss xmm4, xmm3 ; Копируем D[i] в xmm4
ucomiss xmm4, xmm4 ; Сравнение D[i] с самим собой
je .skip_div ; Если D[i] == 0, пропускаем деление
divss xmm0, xmm3 ; xmm0 = (A[i] + B[i]) / D[i]
jmp .continue_calculation ; Переход к продолжению вычисления
.skip_div:
xorps xmm0, xmm0 ; Установить xmm0 в 0.0, если деление на ноль
.continue_calculation:
mulss xmm2, xmm3 ; xmm2 = C[i] * D[i]
addss xmm2, xmm0 ; xmm2 = C[i] * D[i] + (A[i] + B[i]) / D[i]
; Хранение результата в E
movss [E + ebx * 4], xmm2 ; E[i] = Result
; Подготовка для printf
push ebx ; Помещаем текущий индекс
movss xmm0, [E + ebx * 4] ; Загружаем значение из E для printf
movss [esp], xmm0 ; Сохраняем его в памяти на верхушке стека
push dword [esp] ; Вторая запись в стек для float
push ebx ; Помещаем текущий индекс снова
push fmt ; Помещаем строку формата
call printf ; Вызываем printf
add esp, 12 ; Очищаем стек (4 для float + 4 для индекса + 4 для строки формата)
inc ebx ; Увеличиваем индекс
jmp .loop ; Повторяем цикл
.end_loop:
xor eax, eax ; Возвращаем 0
mov esp, ebp ; Восстанавливаем указатель на стек
pop ebp ; Восстанавливаем указатель на базу
ret
问题:如何修复代码,使其正确计算数组 E 中的值?