Big Freeze
真名和姓氏:莱森·肯纳德
出生日期:1973 年 11 月 6 日
死亡时间:1999 年 12 月 25 日
Big Freeze 是一位美国说唱歌手,参与过 Bloods & Crips、Young Soldierz、Nationwide Rip Ridaz、Nationwide Rip Ridaz 2 等项目。Layson 是 Watts Franklin Square Crips 的成员。Big Freeze 在 Young Soldierz 的同名首张专辑中首次亮相1994 年,出现在 Bloods & Crips 项目中。1999 年 12 月 25 日 Big Freeze 在与 Crips 帮派有关的枪战中丧生
#HipHop#
真名和姓氏:莱森·肯纳德
出生日期:1973 年 11 月 6 日
死亡时间:1999 年 12 月 25 日
Big Freeze 是一位美国说唱歌手,参与过 Bloods & Crips、Young Soldierz、Nationwide Rip Ridaz、Nationwide Rip Ridaz 2 等项目。Layson 是 Watts Franklin Square Crips 的成员。Big Freeze 在 Young Soldierz 的同名首张专辑中首次亮相1994 年,出现在 Bloods & Crips 项目中。1999 年 12 月 25 日 Big Freeze 在与 Crips 帮派有关的枪战中丧生
#HipHop#
函数调用(function calls):调用函数的操作取决于操作系统和正在使用的编译器。在更详细地检查栈框架布局和调用约定之前,突出显示一些常用功能可能是有用的。当函数c()调用另一个函数f()(在汇编中调用f)时,包含在rIP指令指针寄存器中的地址被复制到栈中。
这个地址指向要执行的下一个机器指令,我们将它称为RET或IP_C,因为它指向f()之后的c()的指令。 IP通过调用指令自动复制到栈;存储在SP中的地址因此减少。图5-6显示紧接在调用指令之后的SP点。
图5-6. 在调用指令之后的栈指针:
在IP之后要被复制到栈上的下一个数字是存储在BP寄存器中的地址(本章前面讨论过);我们将它称为BP_C,因为它指向c()的栈帧内部。这个操作减少SP的值,它现在指向刚刚保存在栈上的地址, 见图5-7, 在CALL指令之后,栈保存了调用者的返回地址。
保存在栈中的地址IP_C和BP_C将可在f()终止时继续执行c()。在最一般情况下,函数f()调用另一个函数g(),函数g()依次调用h()和soon:c()→f()→g()→h()→...
我们可将一对地址IP_C,BP_C与每个调用关联起来,从而可以通过栈帧向后走。地址IP_C被称为返回地址,每个地址指向调用方的指令后面的组装指令呼叫x。由于每个指向调用方的栈帧内的动态链接。
动态链接的顺序称为动态链。一旦BP寄存器中的地址保存在堆栈中,BP就可被SP的内容覆盖;所以现在BP = SP,因此BP也指向BP_C,如图5-8所示,在CALL指令之后初始化基指针以成为参考点。
让我们记住,BP被用作参数和局部变量的参考点;如果他们保持在右侧(因此在更大的地址处)或在BP_C的左侧,则它们的偏移是正的或负的。例如,在一个32位操作系统上,IP_C的地址是BP + 4,在图中一个正方形代表一个字节。
最后,局部变量和参数被分配在栈上。对于函数f(int p1,int p2) {int v1,v2,v3; ...}栈框架可能如图5-9所示,栈框架的可能布局
寄存器SP指向参数p2的低字节或指向地址较低的另一个字节。当f()调用另一个函数g()时,会发生这种情况,该函数的栈框架创建在与f()相关的左边。这是足够的背景信息;到目前为止我们所知道的将会让我们继续。我们必须建立一个简单的
程序来更详细地研究栈帧内的内容。同样的程序对于猜测编译器当前使用的调用约定也是有用的。为此,程序必须打印运行时栈的内容来定位其帧。
这个地址指向要执行的下一个机器指令,我们将它称为RET或IP_C,因为它指向f()之后的c()的指令。 IP通过调用指令自动复制到栈;存储在SP中的地址因此减少。图5-6显示紧接在调用指令之后的SP点。
图5-6. 在调用指令之后的栈指针:
在IP之后要被复制到栈上的下一个数字是存储在BP寄存器中的地址(本章前面讨论过);我们将它称为BP_C,因为它指向c()的栈帧内部。这个操作减少SP的值,它现在指向刚刚保存在栈上的地址, 见图5-7, 在CALL指令之后,栈保存了调用者的返回地址。
保存在栈中的地址IP_C和BP_C将可在f()终止时继续执行c()。在最一般情况下,函数f()调用另一个函数g(),函数g()依次调用h()和soon:c()→f()→g()→h()→...
我们可将一对地址IP_C,BP_C与每个调用关联起来,从而可以通过栈帧向后走。地址IP_C被称为返回地址,每个地址指向调用方的指令后面的组装指令呼叫x。由于每个指向调用方的栈帧内的动态链接。
动态链接的顺序称为动态链。一旦BP寄存器中的地址保存在堆栈中,BP就可被SP的内容覆盖;所以现在BP = SP,因此BP也指向BP_C,如图5-8所示,在CALL指令之后初始化基指针以成为参考点。
让我们记住,BP被用作参数和局部变量的参考点;如果他们保持在右侧(因此在更大的地址处)或在BP_C的左侧,则它们的偏移是正的或负的。例如,在一个32位操作系统上,IP_C的地址是BP + 4,在图中一个正方形代表一个字节。
最后,局部变量和参数被分配在栈上。对于函数f(int p1,int p2) {int v1,v2,v3; ...}栈框架可能如图5-9所示,栈框架的可能布局
寄存器SP指向参数p2的低字节或指向地址较低的另一个字节。当f()调用另一个函数g()时,会发生这种情况,该函数的栈框架创建在与f()相关的左边。这是足够的背景信息;到目前为止我们所知道的将会让我们继续。我们必须建立一个简单的
程序来更详细地研究栈帧内的内容。同样的程序对于猜测编译器当前使用的调用约定也是有用的。为此,程序必须打印运行时栈的内容来定位其帧。
今天上Animal Ecology 366: natural history of Iowa vertebrates的lab课拍的一些照片:1-疑似Great Horn Owl捕猎场景,从高处铺下捕猎一只没有防备滴松鼠,飞羽在雪地上的印记清晰可见2-被猎松鼠尾巴,可图一那只不是一只,也就是说有两只fox squirrel死在了这里rip3-郊狼足迹,后脚稳稳地踩在前脚
✋热门推荐