ATT格式汇编---计算机硬件对过程的支持

有符号数有两种含义:负数和一个非常大的无符号数

过程(procedure)或函数是结构化编程的工具,参数是过程之间的接口,过程是软件中实现抽象的一种方法。
edure**:
函数名在汇编中是标签
passing control:程序计数器(%rip)需要在进入被调函数之前被设置成为被调函数第一条指令的地址。
passing data: 主调函数能够为被调函数提供参数,被调函数能够为主调函数返回值
allocating and deallocating memory:被调函数开始时可以为本地变量分配内存空间,返回时能释放这些空间
运行时栈(run-time-stack)
栈的访问是从高地址向低地址进行的,也就是栈顶地址小,而栈底地址大,栈指针%rsp始终指向栈顶,栈顶
始终保存着最近保存的数据。在过程调用中栈起着传递参数,为本地变量分配空间,保存主调函数返回地址的
作用。栈的访问在x64中用popq和pushq指令。当一个过程所需的存储空间大于可用寄存器可提供空间的大小,
过程就会在栈上分配自己的空间,这部分区域叫过程的栈帧,一个栈帧的结构是:从栈底向上分别是保存的寄存器
的值,为本地变量分配的空间,将要传递的参数的值,被调用过程返回时的地址(这属于主调函数的特性,因此放
在主调函数的栈帧中)。过程之间可以通过寄存器最多传递6个参数,多余6个的话将被保存在主调函数的栈帧中。
同时如果一个过程本地变量可以完全用寄存器保存的话也不需要在栈帧中分配空间。
控制传递指令:
主要用来设定pc(%rip)的值。
call label
call *operand
ret
每条指令有两个功能:将返回地址入栈(ret是出栈),跳转到新的过程的起始地址
数据传送:
procedure call中的参数传递先通过寄存器传递,有rdi,rci,rdx,rcx,r8,r9,这些寄存器按参数在参数列表中的顺序
来进行分配。
返回值通过rax传递。
在进行数据传递时,所有数据大小要与8(8个字节)的倍数对齐。
栈上的局部存储:
需要在栈中为本地变量分配空间的情况:
没有足够的寄存器保存本地变量
当对局部变量进行了取地址操作了,会在栈中为该变量分配相应空间保存该变量的值,那么栈中的地址就是该变量的地址
(c语言中的传址调用)
局部变量是结构或数组时
寄存器中的局部存储空间:
这一组寄存器是所有过程共享的资源。尽管一次只有一个过程是活跃的但我们要保证被调函数不能覆盖主调函数的一些寄存器中
的值,因为这些值稍后可能会用到。
有一组 被调用函数保存寄存器(callee-saved register)rbx,rbp,r12~r15,规定被调用函数需要保持这些寄存器中的值在
过程执行过程中不能被改变,有两种方法:一是在被调用过程中不用这个寄存器,二是在callee的程序中先将这些寄存器中的
值push进栈,然后在callee中可以操作这些寄存器,只要在callee返回caller前将栈中的值pop进原来对应的寄存器中即可,以上
两种方法最终都不会影响caller随后对这些寄存器中的值的操作。
还有两个寄存器r10和r11,它们叫caller-saved register,这样callee可以对他们进行随意修改,而想要在过程调用前后保持其中的
数值不变的话需要caller在调用callee之前将他们push进run-time-stack

你可能感兴趣的:(汇编语言)