Как записать во внешнюю переменную на ассемблере на msp430

В настоящее время я работаю с TI MSP430 и написал код на ассемблере, показанный ниже. Я хочу записать значение '1' в переменную var, но косвенно через var_ptr, которая содержит адрес var. Прочитав о режимах адресации в Руководстве пользователя, я подумал, что это должно работать, используя & перед переменной-указателем.

///< For testing
.extern var;
.extern var_ptr;

///< A function for testing different commands
.global testfunc
  .type testfunc, @function
testfunc:
  mov #1, &var_ptr

  ret

Эти две внешние переменные определены в другом файле c.

uint16_t    var = 0;
uint16_t*   var_ptr = 0;

Я печатаю содержимое обоих значений до и после вызова функции.

var_ptr = &var;
DEBUG_PRINT(("var: %u, var_ptr: %u\n", var, var_ptr));
testfunc();
DEBUG_PRINT(("var: %u, var_ptr: %u\n", var, var_ptr));

Полученные результаты:

mov #1, &var_ptr

var: 0, var_ptr: 9630<\n>
var: 0, var_ptr: 1<\n>
-------------------------------------------
mov #1, var_ptr

var: 0, var_ptr: 9630<\n>
var: 0, var_ptr: 1<\n>

Независимо от использования & значение '1' всегда записывается непосредственно в переменную var_ptr, а не в var. Как правильно записать переменную var с помощью var_ptr?

РЕДАКТИРОВАТЬ: отличное объяснение режимов адресации можно найти здесь.


person Daiz    schedule 06.05.2017    source источник


Ответы (1)


В синтаксисе ассемблера MSP430 &ADDR и ADDR отличаются только тем, что первый указывает относительный адрес ПК, а второй указывает абсолютный адрес. Разница в основном актуальна для независимого от позиции кода. Чтобы реализовать желаемое, нужно выполнить два хода:

mov var_ptr, r4 // load content of var_ptr into r4
mov #1, @r4     // write #1 to where r4 points
person fuz    schedule 06.05.2017