在IA-32架构中,不是所有的通用寄存器都可以作为8位寄存器使用,只有部分通用寄存器(如AX,BX,CX,DX)可以作为8位寄存器使用。其他寄存器(如SP,BP,SI,DI)只能作为16位或32位寄存器使用。
当一个函数被调用时,通常是由调用者保存寄存器的状态,而被调用者只需要关注已经规定好由调用者保存的寄存器。
除了可以通过栈指针ESP来访问用户栈中的数据之外,还可以通过基址指针EBP来访问用户栈中数据,特别是在调试和程序中插入断点时,通常会使用EBP作为基址指针。
静态( static 型)变量并不分配在对应的栈帧中,而是存储在全局/静态存储区。非静态局部变量存储在栈帧中。
在递归调用中,如果递归调用是尾递归的话,编译器通常会优化为迭代形式,此时各个递归调用的返回地址可能会相同,因为它们实际上都返回到同一个函数开始的位置。
在非尾递归的情况下,每次递归调用都会生成一个新的栈帧,保存的返回地址通常是不同的。
在 switch 语句的机器级代码表示中,每个 case 不一定都对应一条条件转移指令。在某些情况下,可以使用跳转表(jump table)来实现,而不是对每个 case 生成条件转移指令。跳转表是一种用于实现 switch 语句的优化手段,通过直接跳转到表中指定的地址,可以避免生成大量的条件转移指令,从而提高代码的执行效率。
在x86-64架构中,pushq和popq指令是对RSP寄存器(而不是ESP)进行操作。pushq会将RSP寄存器的值减8,popq会将RSP寄存器的值加8。
在IA-32(32位)架构中,(unsigned)long型变量的长度通常是32位,而不是64位。在x86-64(64位)架构中,(unsigned)long型变量的长度确实是64位。
在通用寄存器中传递的参数并不都存放在64位寄存器中。参数的大小和类型会影响其被放置在哪个寄存器中。例如,对于一个8位的char类型参数,它可能会被放置在一个8位的寄存器中,而不是64位的寄存器。
对于返回地址,x86-64并不使用通用寄存器保存,而是使用栈来保存,就像IA-32一样。这是因为返回地址通常在函数调用时被压入栈中,函数执行完毕后被弹出,以便程序可以返回到调用函数后的下一条指令。