我被分配了一个理论上不太难的任务。应使用汇编程序代码(asm)更改c变量。我已经完成了这项工作,而且很有效,但是作业的第二部分是在不使用占位符的情况下做同样的事情。
我在这里不知所措,经过一些研究,我仍然没有找到解决办法。如何在汇编程序代码中访问或管理C变量而不使用占位符来获取变量?
下面是带有占位符的代码:
volatile uint8_t number = 1;
volatile uint8_t *number_pointer = &number;
asm volatile(
"ld r20, %a0" "\n\t"
"lsl r20" "\n\t"
"st %a0, r20" "\n\t"
"breq resetten" "\n\t"
"ret" "\n\t"
"resetten:" "\n\t"
"ldi r20, 1" "\n\t"
"st %a0, r20"
: "+e" (number_pointer)
);
简而言之:如何在不使用%的情况下访问和更改“数字指针”?
(代码将“number”加倍,直到128,然后再次以1开头。)
最佳答案
要评论davids的建议(如果我有足够的声誉,我会把它作为评论发布):在blobbered字段中使用“memory”提示,比如asm(“nop”::“memory”);
这告诉gcc asm语句修改内存,需要重新加载变量等。
例如,使用
static int foo;
int bar()
{
foo = 1;
__asm__("":::"memory");
return foo;
}
我们得到
函数条汇编代码转储:
0x0000000000000000 <+0>: movl $0x1,0x0(%rip) # 0xa <bar+10>
0x000000000000000a <+10>: mov 0x0(%rip),%eax # 0x10 <bar+16>
0x0000000000000010 <+16>: retq
如果没有“内存”,变量值的重新加载将丢失。