2017-02-14 30 views
0

Я хотел узнать Неона. я взял пример на сайте ARM по адресу:Пример умножения неоновой матрицы ARM

http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dai0425/ch04s06s05.html

Я думал, что я хотел бы получить это бежать, а затем начать экспериментировать с ним. ПОЦЕЛУЙ. Программа компилирует штраф (GCC), однако при запуске я получаю «Ошибка сегментации», когда встречается первая команда VST. Удалите инструкции VST, и программа идет своим чередом. Использование GDB все, кажется, работает (регистрирует значения и т. Д.), Просто ошибка возникает, когда дело доходит до процесса хранения в памяти.

Цените каких-либо указаний или помочь ...

.global main 
.func main 
main: 

.macro mul_col_f32 res_q, col0_d, col1_d 
vmul.f32 \res_q, q8, \col0_d[0] @ multiply col element 0 by matrix col 0 
vmla.f32 \res_q, q9, \col0_d[1] @ multiply-acc col element 1 by matrix col 1 
vmla.f32 \res_q, q10, \col1_d[0] @ multiply-acc col element 2 by matrix col 2 
vmla.f32 \res_q, q11, \col1_d[1] @ multiply-acc col element 3 by matrix col 3 
.endm 

LDR R0, =result0a 
LDR R1, =result1a 
LDR R2, =result2a 

vld1.32 {d16-d19}, [r1]! @ load the first eight elements of matrix 0 
vld1.32 {d20-d23}, [r1]! @ load the second eight elements of matrix 0 
vld1.32 {d0-d3}, [r2]!   @ load the first eight elements of matrix 1 
vld1.32 {d4-d7}, [r2]!   @ load the second eight elements of matrix 1 

mul_col_f32 q12, d0, d1  @ matrix 0 * matrix 1 col 0 
mul_col_f32 q13, d2, d3  @ matrix 0 * matrix 1 col 1 
mul_col_f32 q14, d4, d5  @ matrix 0 * matrix 1 col 2 
mul_col_f32 q15, d6, d7  @ matrix 0 * matrix 1 col 3 

vst1.32 {d24-d27}, [r0]! @ store first eight elements of result. 
vst1.32 {d28-d31}, [r0]! @ store second eight elements of result. 

MOV R7, #1 
SWI 0 

result1a: .word 0xFFFFFFFF @ d16 
result1b: .word 0xEEEEEEEE @ d16 
result1c: .word 0xDDDDDDDD @ d17 
result1d: .word 0xCCCCCCCC @ d17 
result1e: .word 0xBBBBBBBB @ d18 
result1f: .word 0xAAAAAAAA @ d18 
result1g: .word 0x99999999 @ d19 
result1h: .word 0x88888888 @ d19 

result2a: .word 0x77777777 @ d0 
result2b: .word 0x66666666 @ d0 
result2c: .word 0x55555555 @ d1 
result2d: .word 0x44444444 @ d1 
result2e: .word 0x33333333 @ d2 
result2f: .word 0x22222222 @ d2 
result2g: .word 0x11111111 @ d3 
result2h: .word 0x0F0F0F0F @ d3 

result0a: .word 0x0  @ R0 
result0b: .word 0x0  @ R0 
result0c: .word 0x0  @ R0 
result0d: .word 0x0  @ R0 
result0e: .word 0x0  @ R0 
result0f: .word 0x0  @ R0 
result0g: .word 0x0  @ R0 
result0h: .word 0x0  @ R0 
+0

Для всех операций загрузки и хранения вы загружаете и сохраняете 16 слов (64 байта), но только определяете место для 8 (32 байта). Это «работает» при чтении ввода, но при сохранении вывода вы пишете 32 байта за концом области данных, которую вы определили. – BitBank

+0

Во-первых, вам следует настоятельно рассмотреть возможность использования C/C++ и intrinsics, а не сборки. Сборка в наши дни - это, в основном, язык «только для чтения», полезный для отладки, поэтому вы можете просто посмотреть на разборку кода встроенного кода. Во-вторых, [DirectXMath] (https://github.com/Microsoft/DirectXMath) включает кодеки intrinsics для ARM32 и ARM64. –

+0

Я попытался расширить область данных, я уточнил источник, чтобы результат был помещен в начале свободной памяти, и, следовательно, хуже было бы записать исходные данные. Ошибка сегментации продолжает происходить. – Smithy

ответ

1

Вы пытаетесь написать 8 * 8 = 64bytes в то время как вы выделили только 4 * 8 = общая 32 байта.

Кроме того, вы, скорее всего, пытается писать в области только для чтения, объявленный .text

Почему вы не обратитесь к функции из C/C++, передавая нужные адреса, выделенные с помощью malloc?

В качестве альтернативы вы можете просто использовать стек.