You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的内存地址,存入t0
  • la t1, VET:取数组首元素vet[0]的地址(也就是符号VET代表的地址),存入t1
  • sd 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 12:57:22