2016-12-05 22 views
0

Итак, я изучаю сборку, и я написал программу для суммирования значений, которые я определяю в 'data_type'.Assembly Beginner: установить переменную, равную количеству значений в DCD?

Atm Мне нужно вручную установить переменную 'num', равную количеству значений в 'data_type', чтобы гарантировать, что цикл суммирует их все.

Мне было интересно, есть ли лучший способ сделать это?

А если есть способ объявить переменную 'num' динамически, чтобы принять количество значений в 'data_type'?

Заранее благодарен!

AREA Sum loop, CODE, READONLY 
ENTRY 
num EQU 5 
Reset_Handler 
LDR r1, =data_values 
MOV r5,#num  
loop 
LDR r2,[r1],#4 
ADD r3,r3,r2 
SUBS r5,r5,#1  
BNE loop 

data_values 
ALIGN 4 
DCD 1, 1, 1, 1, 1 ; example values 
END 
+1

Не уверен в вашем ассемблере, но: 1) что произойдет, если 'data_values' не будет выровнено? Если он работает аналогично другим ассемблерам, символ 'data_values' будет иметь неизмененное значение адреса, в то время как' DCD' будет определять данные на выровненном, поэтому ваш код будет выполнять неравномерный доступ к неправильным байтам данных. Я считаю, что вы должны поменять эти два, сначала выровнять, а затем определить символическую метку. 2) что происходит после 'BNE'? Или вы просто запускаете это в отладчике до этого момента, не позволяя ему выйти за пределы вашего определенного кода? – Ped7g

+0

Хорошо, спасибо, обменяй их сейчас. Использование инструментов Keil. Я просто запускаю его в BNE в отладчике, поскольку это всего лишь учебное упражнение, есть ли у вас какие-либо рекомендации относительно того, как достичь того, что я просил выше? – ohkneel

ответ

1

мне было интересно, есть ли лучший способ сделать это?

Мнение на основе ... и слишком широкое. Существует множество способов структурирования ваших данных, каждый из которых может подойти вам в разных ситуациях. Я постараюсь перечислить все основные (держу пари, я забуду некоторые).

время компиляции:

  • что вы сделали
  • определить не только ярлык на начало данных, но и в конце данных, то от их разности можно вычислить длину в байтах (если ассемблер Безразлично» t поддерживает базовое выражение, для этого может потребоваться расчет времени выполнения).
  • Многие ассемблеры поддерживают базовые выражения, где вместо определения концевой метки вы можете фактически сделать что-то вроде num equ (($ - start_label)/4), где $ - это текущий адрес на некоторых ассемблерах (возможно, не с вашим, это пример x86 TASM/MASM).
  • Размер элемента и массива полностью фиксирован навсегда (то есть «набор из 15 строк, каждый из 5 символов длиной» => 75 байт в точности и код написан для поддержки только этого - возможно, не очень полезного в реальном мире, за исключением некоторых hw- ограниченные угловые случаи .. или быстрое утилизацию обучения с упором на что-то другое, где фиксированный массив не имеет значения).

Runtime:

  • писать код таким образом, что вызывающая функция должна поддерживать не только адрес массива, но и его размер (очень универсальный стиль API, как правило, можно согнуть любую другую структуру данные, которые должны обрабатываться таким API, хотя с массивами с прекращением действия, это может быть не оптимально эффективным, так как вам нужно сначала вычислить размер) - это делегирует проблему структуры вызывающему, не решает ее самостоятельно.
  • использовать некоторое значение как терминатор, например ASCII Z строки заканчиваются значением 0.
  • Используйте некоторую структуру данных, например C++ std::vector, где внутренняя структура данных содержит не только указатель на память, но и отдельную переменную для хранения размера вектора (плюс несколько других переменных, сохраняющих емкость выделенной памяти и размер последнего выделения , и т. д. проверьте любую реализацию std::vector, чтобы получить эту идею), в вашем случае вы можете пойти, например, для простейшего DCD 5, 1, 1, 1, 1, 1 (первое слово - это размер, затем данные следуют).
  • все, что вы можете придумать ..некоторые примеры из реального мира представляют собой различные чередующиеся структуры, такие как разделенные бит-плоскости в старых режимах цветной графики EGA 16, где один банк памяти хранит один бит на пиксель, и для рисования одного пикселя вам нужно было переключиться на все четыре банка памяти , записывая каждое конкретное значение бита. Вы можете в значительной степени создать что угодно, что вы можете достаточно математически определить и написать для него код.

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

  • Нет связанных вопросов^_^