【计算机组成原理】程序的转换及机器级表示 易错易混点解析

每个通用寄存器都可作为 32 位、 16 位或 8 位寄存器使用?(错误)

在IA-32架构中,不是所有的通用寄存器都可以作为8位寄存器使用,只有部分通用寄存器(如AX,BX,CX,DX)可以作为8位寄存器使用。其他寄存器(如SP,BP,SI,DI)只能作为16位或32位寄存器使用。

【计算机组成原理】程序的转换及机器级表示 易错易混点解析_第1张图片

在 IA-32 / Linux(GCC)的过程调用中,在过程中通常先使用被调用者保存寄存器?(错误)

当一个函数被调用时,通常是由调用者保存寄存器的状态,而被调用者只需要关注已经规定好由调用者保存的寄存器。

在 IA-32 / Linux(GCC)的过程调用中,只能通过将栈指针 ESP 作为基址寄存器来访问用户栈中的数据?(错误)

除了可以通过栈指针ESP来访问用户栈中的数据之外,还可以通过基址指针EBP来访问用户栈中数据,特别是在调试和程序中插入断点时,通常会使用EBP作为基址指针。

对于 C 程序,静态( static 型)变量和非静态局部变量都分配在对应栈帧中?(错误)

静态( static 型)变量并不分配在对应的栈帧中,而是存储在全局/静态存储区。非静态局部变量存储在栈帧中。

对于递归过程调用,每次递归调用在栈帧中保存的返回地址都不相同?(错误)

在递归调用中,如果递归调用是尾递归的话,编译器通常会优化为迭代形式,此时各个递归调用的返回地址可能会相同,因为它们实际上都返回到同一个函数开始的位置。

在非尾递归的情况下,每次递归调用都会生成一个新的栈帧,保存的返回地址通常是不同的。

对于 switch 语句的机器级代码表示,每个 case 至少对应一条条件转移指令,因而一定会包含多条条件转移指令?(错误)

在 switch 语句的机器级代码表示中,每个 case 不一定都对应一条条件转移指令。在某些情况下,可以使用跳转表(jump table)来实现,而不是对每个 case 生成条件转移指令。跳转表是一种用于实现 switch 语句的优化手段,通过直接跳转到表中指定的地址,可以避免生成大量的条件转移指令,从而提高代码的执行效率。

在x86-64中,pushq 和 popq 分别对 ESP 寄存器减 8 和加 8?(错误)

在x86-64架构中,pushq和popq指令是对RSP寄存器(而不是ESP)进行操作。pushq会将RSP寄存器的值减8,popq会将RSP寄存器的值加8。

(unsigned) long 型变量在 IA-32 和 x86-64 中的长度都是 64 位(四字)?(错误)

在IA-32(32位)架构中,(unsigned)long型变量的长度通常是32位,而不是64位。在x86-64(64位)架构中,(unsigned)long型变量的长度确实是64位。

x86-64 过程调用中,在通用寄存器中传递的参数,都存放在 64 位寄存器中?(错误)

在通用寄存器中传递的参数并不都存放在64位寄存器中。参数的大小和类型会影响其被放置在哪个寄存器中。例如,对于一个8位的char类型参数,它可能会被放置在一个8位的寄存器中,而不是64位的寄存器。

对于返回地址, x86-64 使用通用寄存器保存,而 IA-32 使用栈来保存?(错误)

对于返回地址,x86-64并不使用通用寄存器保存,而是使用栈来保存,就像IA-32一样。这是因为返回地址通常在函数调用时被压入栈中,函数执行完毕后被弹出,以便程序可以返回到调用函数后的下一条指令。

你可能感兴趣的:(Computer,Composition,Principle,硬件架构)