如何在msp430的汇编程序中写入外部变量
How to write to external variable in assembler on the 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_ptr 写入变量 var 的正确方法是什么?
编辑:
可以找到关于寻址模式的很好的解释 here。
在MSP430汇编语法中,&ADDR
和ADDR
的区别仅在于前者指定PC相对地址,后者指定绝对地址。差异主要与位置无关代码有关。要实现你想要的,你需要执行两个动作:
mov var_ptr, r4 // load content of var_ptr into r4
mov #1, @r4 // write #1 to where r4 points
我目前正在使用 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_ptr 写入变量 var 的正确方法是什么?
编辑: 可以找到关于寻址模式的很好的解释 here。
在MSP430汇编语法中,&ADDR
和ADDR
的区别仅在于前者指定PC相对地址,后者指定绝对地址。差异主要与位置无关代码有关。要实现你想要的,你需要执行两个动作:
mov var_ptr, r4 // load content of var_ptr into r4
mov #1, @r4 // write #1 to where r4 points