汇编risc v中的指针

sd2nnvve  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(91)

我正在学习risc v汇编语言中的指针,但是看到教授的代码让我怀疑他是否犯了错误,或者我是否遗漏了什么。这个练习是关于从C语言转换到汇编语言Risc V的,我认为,因为在C语言中,给定一个变量array[N]array是指向array[0]的指针,在汇编语言中它是类似的,通过定义ARRAY: .dword 1,2,3,4ARRAY将是指向array[0]的指针的地址,而不是直接指向array[0]的地址。
给定的C代码是(只有一个片段,其余的都没用)

typedef long long int LONG
LONG vet[10] = {1,9,3,4,3,15,7,8,2,3}
LONG *p
void main (){
  p = vet
…

相关的汇编代码是

VET: .dword 1,9,3,4,3,15,7,8,2,3
P: .dword
.text
.globl MAIN

MAIN: la t0, P
      la t1, VET
      sd t1, (t0)
…

我的疑惑

现在:我很清楚C中的代码,p=vet是将vet指针中的值(vet[0]的地址)赋值给p,所以p现在指向vet[0]的内存单元。但是,相反,在汇编中,在我看来,对于la t0, P,我们将P的地址分配给t0,对于la t1, VET,我们将t1的vet指针的地址分配给t1,而对于sd t1, (t0),我们将vet的地址的值放在p内部,所以p现在指向vet,而不是vet[0]

我的回答

所以要么代码是错的

VET: .dword 1,9,3,4,3,15,7,8,2,3
P: .dword
.text
.globl MAIN

MAIN: la t0, P
      la t1, VET
      ld t2, (t1)
      sd t2, (t0)

或者C中的“VET”实际上是数组vet[0]第一个元素地址的符号,而不是vet[0]地址内的指针地址的符号。

iezvtpos

iezvtpos1#

......分配vet指针的地址......
VET不是指针。VET: .dword 1,9,3,4,3,15,7,8,2,3使VET成为.dword 1,9,3,4,3,15,7,8,2,3指定的数据的标签。标签的值是该数据的地址。在汇编中,VET是地址,而不是一个值是地址的指针。
(Also在C中,vet,当用LONG vet[10] = {1,9,3,4,3,15,7,8,2,3};定义时,是一个数组,而不是指针。当该数组用于表达式中而不是作为sizeof的操作数或一元&的操作数时,它将自动转换为其第一个元素的地址。

nhhxz33t

nhhxz33t2#

  1. vet是一个数组而不是指针。数组decay在表达式中作为值使用时指向指针。
    1.编译器不必遵循程序编写的方式。编译后的程序只需要具有相同的可观察行为。你的例子中没有任何一个,所以main语句将被简化为return语句。
    1.在汇编语言中没有指针只有地址
    如果没有数组类型,那么C中的数组是什么呢?
    当然,它是数组类型,在标准中提到过很多次。
int arr[5];

arr-衰减到指向数组第一个元素的指针&arr-衰减到指向5个元素的数组的指针。

相关问题