RISC-V汇编中数组指针转换的疑问及代码正确性验证
关于RISC-V汇编中数组符号与C指针的对应问题
核心结论
RISC-V汇编里的VET符号就是vet[0]的地址,和C语言中数组名vet的语义完全一致,教授给出的汇编代码是正确的,你的修改反而存在逻辑错误。
详细解释
1. C语言中数组名的语义
在C语言里,数组名vet在表达式(比如p = vet)中会自动隐式转换为指向数组首元素的指针,等价于&vet[0]。所以p = vet的本质是把首元素vet[0]的地址赋值给指针p。
2. 教授汇编代码的正确性
教授的代码逻辑完全对应C的行为:
la t0, P:取全局变量p的内存地址,存入t0la t1, VET:取数组首元素vet[0]的地址(也就是符号VET代表的地址),存入t1sd t1, (t0):把t1里的地址值(vet[0]的地址)写入到p的内存位置,完成p = vet的赋值
3. 你修改后的代码问题
你添加的ld t2, (t1)是错误的:
ld t2, (t1)是从t1指向的内存地址(也就是vet[0]的位置)加载数据,得到的是vet[0]的值1- 然后
sd t2, (t0)是把这个数值1写入p的内存,这相当于C里的p = (LONG*)1,完全偏离了原代码p = vet的指针赋值逻辑
关键澄清
RISC-V汇编中的符号(比如VET)直接代表该符号所在位置的内存地址,不存在“指向指针的地址”这一说法——VET就是数组首元素的起始地址,和C中&vet[0]完全等价。
内容的提问来源于stack exchange,提问作者selenio34
相关产品推荐
相关产品推荐

