57、如果汇编语言指令拼写错误(例如,用“mv”代替“mov”),何时会发现该错误?请回答汇编时或运行时。
汇编时
58、如果引用了一个标签,但该标签未被定义,那么这个错误会在什么时候被发现?请用汇编时(assemble - time)或运行时(run - time)作答。
汇编时
59、如果一个程序对数组中的值进行一系列除法运算时除以 0,这个错误何时会被发现?请回答汇编时(assemble - time)或运行时(run - time)。
运行时
60、汇编语言源文件中宏定义应放在哪里?
宏定义应放在源文件的数据和代码段之前。
61、当宏被调用时,代码会在代码段中放置多少次?
每次宏被调用时,代码都会被放置一次。
62、解释为什么在宏中,标签通常以两个百分号(%%)开头。
在宏中标签前加%%,可确保多次调用同一宏时每次使用不同标签。
63、宏参数替换何时发生?
汇编时
64、实现一个用于计算列表平均值的宏的示例程序。使用调试器执行该程序并显示最终结果。创建一个调试器输入文件来展示结果。
需按照以下步骤完成:
- 编写计算列表平均值的宏的示例程序;
- 使用调试器执行编写好的程序;
- 通过调试器显示程序的最终结果;
- 创建一个调试器输入文件,将结果展示在其中。
65、编写一个程序,使其包含查找列表中的最小值和最大值的功能。使用调试器执行程序并显示最终结果。创建一个调试器输入文件来展示结果。
需先编写一个包含查找列表最小值和最大值功能的程序,然后使用调试器运行该程序,记录最终结果,并创建一个调试器输入文件,将结果展示在其中。
66、函数调用的两个主要操作是什么?
函数调用的两个主要操作是 链接 和 参数传递 。
- 链接 :要求函数能返回其最初被调用的正确位置;
- 参数传递 :要求函数能够访问参数以进行操作或返回结果。
67、实现链接的两条指令是什么?
实现链接的两条指令是call 和ret指令。
68、当使用值来传递参数时,这种方式被称为什么?
按值调用(call-by-value)
69、当使用地址传递参数时,这种方式被称为什么?
按引用调用(call-by-reference)
70、如果一个函数被调用了15次,汇编器会将该函数的代码放入内存多少次?
一次,无论调用多少次。
71、根据课堂讨论的标准调用约定,大多数过程中初始压栈和最终出栈的目的是什么?
初始压栈是为了保存程序状态(即特定寄存器和栈的内容),最终出栈是为了恢复程序状态。
72、如果有六个64位整数参数传递给一个函数,每个参数应具体传递到哪里?
以下是调整为 Markdown 格式的内容:
第一个参数传递到 rdi
,第二个参数传递到 rsi
,第三个参数传递到 rdx
,第四个参数传递到 rcx
,第五个参数传递到 r8
,第六个参数传递到 r9
。
73、如果有六个32位整数参数传递给一个函数,每个参数具体应该传递到哪里?
以下是调整为 Markdown 格式的文本内容:
前六个32位整数参数通过寄存器传递,具体如下:
- 第一个参数传递到
edi
- 第二个参数传递到
esi
- 第三个参数传递到
edx
- 第四个参数传递到
ecx
- 第五个参数传递到
r8d
- 第六个参数传递到
r9d
74、调用语句后执行 add rsp, <立即数> 的目的是什么?
该操作的目的是从栈中清除基于栈的参数。
75、如果有三个参数通过栈传递,且每个参数是 8 字节, 的值是多少?
因为每个参数是 8 字节,所以 的值为 3 * 8 = 24。
76、如果一个函数有七个参数传入,并且函数自身按顺序压入了 rbp、rbx 和 r12 寄存器,使用标准调用约定时,基于栈的参数的正确偏移量是多少?
第一个栈基参数(第7个整数参数)的偏移量是 [rbp + 16]
77、如果一个函数必须为变量sum返回结果,那么sum变量应该如何传递(按引用传递还是按值传递)?
按引用传递
78、编写一个程序,先实现对一个列表进行排序的功能,再添加一个统计函数,该函数用于找出已排序列表的最小值、中位数、最大值、总和以及平均值。统计函数应在排序函数之后调用,以便更轻松地找出最小值和最大值。使用调试器执行程序并显示最终结果。创建一个调试器输入文件来展示结果。
首先编写一个排序程序对列表进行排序,然后添加一个统计函数,该函数能计算已排