首页 > 试题广场 >

在ARM调用标准(ATPC)中,函数的参数是怎么传递?()

[单选题]
在ARM调用标准(ATPC)中,函数的参数是怎么传递?()
  • 通过寄存器传递
  • 通过堆栈传递
  • 通过寄存器或堆栈传递
  • 说法都错误
1. ATPC (Automatic Transfer Power Control) 自动发信功率控制。技术的要点是微波发信机的输出功率在ATPC控制范围内自动跟踪接收段接收电平的变化而变化

2. 基本ATPCS规定了在子程序调用时的一些基本规则,包括下面3方面的内容:
1、寄存器的使用必须满足下面的规则:
1).子程序间通过寄存器R0一R3来传递参数,这时,寄存器R0~R3可以记作A1-A4。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。
2).在子程序中,使用寄存器R4~R11来保存局部变量.这时,寄存器 R4 ~ R11可以记作V1 ~ V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。
3).寄存器R12用作过程调用时的临时寄存器(用于保存SP,在函数返回时使用该寄存器出栈), 记作ip。在子程序间的连接代码段中常有这种使用规则。
4).寄存器R13用作数据栈指针,记作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等。
5).寄存器R14称为连接寄存器,记作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
6).寄存器R15是程序计数器,记作pc。它不能用作其他用途。

ATPCS下ARM寄存器的命名:
R0    a1    工作寄存器
R1    a2    工作寄存器
R2    a3    工作寄存器
R3    a4    工作寄存器
R4    v1    必须保护;局部变量寄存器
R5    v2    必须保护;局部变量寄存器
R6    v3    必须保护;局部变量寄存器
R7    v4    必须保护;局部变量寄存器
R8    v5    必须保护;局部变量寄存器
R9    v6    必须保护;局部变量寄存器
R10    sl    栈限制
R11    fp    帧指针
R12    ip    指令指针
R13    sp    栈指针
R14    lr    连接寄存器

参数的传递规则:
     根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.
     
1.参数个数可变的子程序参数传递规则
     对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数. 
     在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器R0,R1,R2,R3; 如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈. 
      按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递.
    
 2.参数个数固定的子程序参数传递规则
     对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同,如果系统包含浮点运算的硬件部件。
      浮点参数将按照下面的规则传递: 
      (1)各个浮点参数按顺序处理;
      (2)为每个浮点参数分配FP寄存器;
        分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器.第一个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递.
     3、子程序结果返回规则
     1.结果为一个32位的整数时,可以通过寄存器R0返回.
     2.结果为一个64位整数时,可以通过R0和R1返回,依此类推.
     3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回.
     4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回.
     5.对于位数更多的结果,需要通过调用内存来传递
发表于 2019-03-27 09:43:18 回复(2)
没看懂,这意思不是就是通过寄存器和栈吗?哪位爸爸来解释一下,感谢🙏
发表于 2021-01-31 20:12:29 回复(0)
1. ATPC (Automatic Transfer Power Control) 自动发信功率控制。技术的要点是微波发信机的输出功率在ATPC控制范围内自动跟踪接收段接收电平的变化而变化

2. 基本ATPCS规定了在子程序调用时的一些基本规则,包括下面3方面的内容:
1、寄存器的使用必须满足下面的规则:
1).子程序间通过寄存器R0一R3来传递参数,这时,寄存器R0~R3可以记作A1-A4。被调用的子程序在返回前无需恢复寄存器R0~R3的内容。
2).在子程序中,使用寄存器R4~R11来保存局部变量.这时,寄存器 R4 ~ R11可以记作V1 ~ V8。如果在子程序中使用到了寄存器V1~V8中的某些寄存器,子程序进入时必须保存这些寄存器的值,在返回前必须恢复这些寄存器的值;对于子程序中没有用到的寄存器则不必进行这些操作。在Thumb程序中,通常只能使用寄存器R4~R7来保存局部变量。
3).寄存器R12用作过程调用时的临时寄存器(用于保存SP,在函数返回时使用该寄存器出栈), 记作ip。在子程序间的连接代码段中常有这种使用规则。
4).寄存器R13用作数据栈指针,记作sp。在子程序中寄存器R13不能用作其他用途。寄存器sp在进入子程序时的值和退出子程序时的值必须相等。
5).寄存器R14称为连接寄存器,记作lr。它用于保存子程序的返回地址。如果在子程序中保存了返回地址,寄存器R14则可以用作其他用途。
6).寄存器R15是程序计数器,记作pc。它不能用作其他用途。
ATPCS下ARM寄存器的命名:
R0    a1    工作寄存器
R1    a2    工作寄存器
R2    a3    工作寄存器
R3    a4    工作寄存器
R4    v1    必须保护;局部变量寄存器
R5    v2    必须保护;局部变量寄存器
R6    v3    必须保护;局部变量寄存器
R7    v4    必须保护;局部变量寄存器
R8    v5    必须保护;局部变量寄存器
R9    v6    必须保护;局部变量寄存器
R10    sl    栈限制
R11    fp    帧指针
R12    ip    指令指针
R13    sp    栈指针
R14    lr    连接寄存器

参数的传递规则:
     根据参数个数是否固定,可以将子程序分为参数个数固定的子程序和参数个数可变的子程序.这两种子程序的参数传递规则是不同的.
     
1.参数个数可变的子程序参数传递规则
     对于参数个数可变的子程序,当参数不超过4个时,可以使用寄存器R0~R3来进行参数传递,当参数超过4个时,还可以使用数据栈来传递参数. 
     在参数传递时,将所有参数看做是存放在连续的内存单元中的字数据。然后,依次将各名字数据传送到寄存器R0,R1,R2,R3; 如果参数多于4个,将剩余的字数据传送到数据栈中,入栈的顺序与参数顺序相反,即最后一个字数据先入栈. 
      按照上面的规则,一个浮点数参数可以通过寄存器传递,也可以通过数据栈传递,也可能一半通过寄存器传递,另一半通过数据栈传递.
    
 2.参数个数固定的子程序参数传递规则
     对于参数个数固定的子程序,参数传递与参数个数可变的子程序参数传递规则不同,如果系统包含浮点运算的硬件部件。
      浮点参数将按照下面的规则传递: 
      (1)各个浮点参数按顺序处理;
      (2)为每个浮点参数分配FP寄存器;
        分配的方法是,满足该浮点参数需要的且编号最小的一组连续的FP寄存器.第一个整数参数通过寄存器R0~R3来传递,其他参数通过数据栈传递.
     3、子程序结果返回规则
     1.结果为一个32位的整数时,可以通过寄存器R0返回.
     2.结果为一个64位整数时,可以通过R0和R1返回,依此类推.
     3.结果为一个浮点数时,可以通过浮点运算部件的寄存器f0,d0或者s0来返回.
     4.结果为一个复合的浮点数时,可以通过寄存器f0-fN或者d0~dN来返回.
     5.对于位数更多的结果,需要通过调用内存来传递
发表于 2019-07-28 13:48:55 回复(0)
总结一下,就是根据参数不同,可以有寄存器,栈,寄存器+栈,内存的方式进行传递
发表于 2022-05-30 10:51:46 回复(0)
ATPCS下ARM寄存器的命名:
R0    a1    工作寄存器
R1    a2    工作寄存器
R2    a3    工作寄存器
R3    a4    工作寄存器
R4    v1    必须保护;局部变量寄存器
R5    v2    必须保护;局部变量寄存器
R6    v3    必须保护;局部变量寄存器
R7    v4    必须保护;局部变量寄存器
R8    v5    必须保护;局部变量寄存器
R9    v6    必须保护;局部变量寄存器
R10    sl    栈限制
R11    fp    帧指针
R12    ip    指令指针
R13    sp    栈指针
R14    lr    连接寄存器
R15   pc   程序计数器
发表于 2020-02-27 05:08:59 回复(0)