|
|
@ -1,6 +1,6 @@
|
|
|
|
# PW6 实验报告
|
|
|
|
# PW6 实验报告
|
|
|
|
|
|
|
|
|
|
|
|
学号PB2100 姓名 吴书让
|
|
|
|
学号PB21000179 姓名 吴书让
|
|
|
|
学号PB21111627 姓名 罗胤玻
|
|
|
|
学号PB21111627 姓名 罗胤玻
|
|
|
|
|
|
|
|
|
|
|
|
## 问题回答
|
|
|
|
## 问题回答
|
|
|
@ -87,6 +87,27 @@ define dso_local i32 @main() #0 { ; 定义一个名为main的函数,返回类
|
|
|
|
2. 函数调用语句对应的LLVM IR的代码中,会将函数的返回值存储到一个临时变量中,然后再对临时变量进行操作。
|
|
|
|
2. 函数调用语句对应的LLVM IR的代码中,会将函数的返回值存储到一个临时变量中,然后再对临时变量进行操作。
|
|
|
|
3. 调用者使用`call`指令调用被调用者,被调用者使用`ret`指令返回调用者。
|
|
|
|
3. 调用者使用`call`指令调用被调用者,被调用者使用`ret`指令返回调用者。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
------
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Task2
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> 2-1 请给出`SysYFIR.md`中提到的两种getelementptr用法的区别, 并解释原因:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**2-1:**
|
|
|
|
|
|
|
|
- `getelementptr`实际上是一条指针计算语句,不进行任何数据的访问或修改,作用是计算指针并修改计算后指针的类型。
|
|
|
|
|
|
|
|
- 第一个参数为要进行计算原始指针的类型;
|
|
|
|
|
|
|
|
- 第二个参数是原始指针,往往是一个结构体指针,或数组首地址指针。
|
|
|
|
|
|
|
|
- 第二个参数及以后的参数,都称为index,表示要进行计算的参数,作用在第二个参数给出的初始指针,如结构体的第几个元素,数组的第几个元素。
|
|
|
|
|
|
|
|
- **第一种用法**:获取数组元素所在地址,一个偏移0得到%1指向数组的第一个,用第二个偏移0得到首元素向后偏移量,返回此地址
|
|
|
|
|
|
|
|
- **第二种用法**:获取指针地址,第一个偏移0计算得到%1所指的变量,并返回该变量的地址
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
-----
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
### Task3
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
> 3-1. 在`scope`内单独处理`func`的好处有哪些。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
**3-1:** 在不同的scope中可以使用相同的变量名,而不必担心命名冲突的问题,同时也可以提高代码的可读性和可维护性。
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
## 实验设计
|
|
|
|
## 实验设计
|
|
|
|