留言与评论(共有 0 条评论) |
发布时间:2020-04-15 16:45:21
先加点限制:
变量为局部变量,即函数内部的"auto"变量
地址2001不正常,对于普通32位系统,地址应32位对齐,此处改为2004
假设CPU为32位ARM
下面是稍加限制后的代码:
void test()
{
int a;
a=5;
......
}
少数变量保存在寄存器中;过多的变量保存在堆栈顶部。
在汇编指令中用堆栈指针+偏移量即可访问。
下面假设a保存在寄存器R1。
常量5很小,不需保存到数据段中。
a=5对应如下:
LDR R1, #5
一条指令即可装入。
我们假设常量不是5,而是0xdeadbeef这样的大数,那就应保存在数据段中,即:
data+2004 (data + 0x7d4)
偏移量2004将被编译到代码中,由于此偏移量较大,需使用两条指令将偏移量为2004的地址装入寄存器R2,如下:
ADD R2, Rdata, #2000
LDR R1, [R2,#4]
如果偏移量较小(204),则可以这样:
LDR R1, [Rx,#204]
留言与评论(共有 0 条评论) |
全站搜索