我正在学习risc v汇编语言中的指针,但是看到教授的代码让我怀疑他是否犯了错误,或者我是否遗漏了什么。这个练习是关于从C语言转换到汇编语言Risc V的,我认为,因为在C语言中,给定一个变量array[N]
,array
是指向array[0]
的指针,在汇编语言中它是类似的,通过定义ARRAY: .dword 1,2,3,4
,ARRAY
将是指向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]地址内的指针地址的符号。
2条答案
按热度按时间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
的操作数或一元&
的操作数时,它将自动转换为其第一个元素的地址。nhhxz33t2#
vet
是一个数组而不是指针。数组decay在表达式中作为值使用时指向指针。1.编译器不必遵循程序编写的方式。编译后的程序只需要具有相同的可观察行为。你的例子中没有任何一个,所以main语句将被简化为return语句。
1.在汇编语言中没有指针只有地址
如果没有数组类型,那么C中的数组是什么呢?
当然,它是数组类型,在标准中提到过很多次。
arr
-衰减到指向数组第一个元素的指针&arr
-衰减到指向5个元素的数组的指针。