mirror of
https://github.com/foxsen/archbase.git
synced 2026-02-10 05:35:40 +08:00
@@ -356,6 +356,9 @@ valign(i = NULL, j = NULL, valign = "top", part = "body") %>%
|
||||
theme_box()
|
||||
|
||||
```
|
||||
|
||||
5)LoongArch部分指令特色。LoongArch作为一个全新的指令系统,在指令取舍和应用程序二进制程序接口设计等方面充分借鉴了现代指令系统研究的经验一方面
|
||||
|
||||
## C语言的机器表示
|
||||
|
||||
C语言等高级语言编写的程序必须经过编译器转换为汇编语言,再由汇编器转换为指令码才能在CPU上执行。本节简要介绍高级语言转换为指令码涉及的一些问题,为方便起见,选择C语言和LoongArch汇编码进行介绍。
|
||||
|
||||
@@ -208,7 +208,7 @@ knitr::include_graphics("materials/chapter4/simple.S.png")
|
||||
knitr::include_graphics("materials/chapter4/simple_nofp.S.png")
|
||||
```
|
||||
|
||||
大部分函数可以只用\$sp来管理栈帧。如果在编译时能够确定函数的栈帧大小,编译器可以在函数头分配所需的栈空间(通过调整\$sp),这样在函数栈帧里的内容都有一个编译时确定的相对于$sp的偏移,也就不需要帧指针\$fp了。例如图\@ref(fig:normal-c)中的normal函数,用gcc -O2 -S编译的结果如图\@ref(fig:normal-as)所示。normal函数调用了一个有9个整数参数的外部函数,这样它必须有栈帧来为调用的子函数准备参数。可以看到,编译器生成了一个32字节的栈帧,把最后一个浮点参数9保存到偏移0,把返回地址\$ra保存到偏移24。
|
||||
大部分函数可以只用\$sp来管理栈帧。如果在编译时能够确定函数的栈帧大小,编译器可以在函数头分配所需的栈空间(通过调整\$sp),这样在函数栈帧里的内容都有一个编译时确定的相对于$sp的偏移,也就不需要帧指针\$fp了。例如图\@ref(fig:normal-c)中的normal函数,用gcc -O2 -S编译的结果如图\@ref(fig:normal-as)所示。normal函数调用了一个有9个整数参数的外部函数,这样它必须有栈帧来为调用的子函数准备参数。可以看到,编译器生成了一个32字节的栈帧,把最后一个参数9保存到偏移0,把返回地址\$ra保存到偏移24。
|
||||
|
||||
```{r normal-c, echo=FALSE, fig.align='center', fig.cap="normal函数代码", out.width='100%'}
|
||||
knitr::include_graphics("materials/chapter4/normal.c.png")
|
||||
|
||||
Reference in New Issue
Block a user