上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给出解释。