计算机体系结构基础(第3版)
上QQ阅读APP看书,第一时间看更新

习题

1.列出以下C程序中,按照Linux/LoongArch64 ABI的函数调用约定,调用nested函数时每个参数是如何传递的。


struct small {
    char c;
    int d;
} sm;

struct big {
    long a1;
    long a2;
    long a3;
    long a4;
} bg;

extern long nested(char a, short b, int c, long d, float e, double f, struct small g,struct
    big h, long i);
long test(void){
    return nested((char)0x61,(short)0xffff, 1, 2, 3. 0, 4. 0, sm, bg, 9);
}

2.(1)用LoongArch汇编程序片段来举例并分析在未同步的线程之间(假设多个线程可同时运行该片段)进行共享数据访问出错的情况。

(2)用LL/SC指令改写你的程序片段,使它们的共享数据访问正确。

3.(1)写一段包含冒泡排序算法实现函数的C程序,在你的机器上安装LoongArch交叉编译器,通过编译-反汇编的方式提取该算法的汇编代码。

(2)改变编译的优化选项,记录算法汇编代码的变化,并分析不同优化选项的效果。

4.ABI中会包含对结构体中各元素的对齐和摆放方式的定义。

(1)在你的机器上用C语言编写一段包含不同类型(含char、short、int、long、float、double和long double)元素的结构体的程序,并获得结构体总空间占用情况。

(2)调整结构体元素顺序,观察结构体总空间占用情况的变化,推测并分析结构体对齐的方式。

5.用汇编或者带嵌入汇编的C语言编写一个程序,通过直接调用系统调用,让它从键盘输入一个字符并在屏幕打印出来。用调试器单步跟踪指令执行,观察系统调用指令执行前后的寄存器变化情况,对照相应平台的ABI给出解释。