TA的每日心情 | 衰 2015-8-29 20:27 |
---|
签到天数: 5 天 连续签到: 1 天 [LV.2]偶尔看看I
|
原贴地址:https://www.cirmall.com/bbs/thread-41001-1-3.html
3课ok03
本课的教学建立在ok03 ok02如何装配使用功能更可重用代码和rereadable。这是假设你的代码为2课:ok02操作系统为基础的。
1可重复使用的代码
到目前为止,我们已经通过我们的国产操作系统的码型发生的事情,我们想在秩序。这个小程序是这样好,如果我们像这样写的整个系统的代码,将unreadable完全。相反,我们使用的功能。
说的功能是被“黑盒”。我们把输入和输出,在外面吃,但我们不需要知道他们的工作。
高层次的代码,如C或C + +的功能,是语言本身的一部分。汇编代码中的函数是有思想的,只是我们。
我们想ideally能够设置一些寄存器的值,我们输入一个地址,分支,和期望的是在一些点在我们的代码,将代码分回的HAVING输出设置寄存器的值。这是一个函数的汇编代码是什么。困难是我们的系统使用的是在设置寄存器。如果我们使用任何系统,我们只是觉得每样,可能使用不同的系统程序员,程序员的工作,找到其他坚硬了解。此外,编译器将不能够很容易地与汇编代码的工作,他们将不知道如何使用的功能。为防止混淆,标准的应用程序二进制接口(ABI)是为每个devised这是一个汇编语言函数上的协议应该如何运行。如果每个人都以同样的方式,使得函数,那么每个人都将能够使用每个人的功能。我将在这一标准的教学,从现在开始我将和我的代码的功能来满足所有的标准。
标准说,R0,R1,R2和R3的输入将被使用的函数中的顺序。如果功能需求的输入,那么它是不是需要有价值的物质。如果它需要的只有一个,它永远都在,如果它需要二,R0的,都在第一和第二的R0,R1和OS都在线,在线。输出将永远是0。蛛网膜下腔出血(SAH)如果函数输出什么,它不是以物的价值R0。
此外,它也需要这样的功能,在运行到R12的,R4的,他们必须有相同的值,当函数的开始。这意味着,当你调用这个函数,你可以肯定的是R4的到R12的值不会改变,但你不能确定什么是R0到R3的。
当你完成后,它已到函数的代码分支,然后它。这是地址“必须知道的均值,然后它的代码。为了方便这一点,有一个特殊的寄存器被称为LR(链接在地址寄存器),永远保持的指令后,把这一功能。
表1.1 ARM寄存器使用ABI(TD)
Register | Brief | Preserved | Rules | r0 | Argument and result | No | r0 and r1 are used for passing the first two arguments to functions, and returning the results of functions. If a function does not use them for a return value, they can take any value after a function. | r1 | Argument and result | No | r2 | Argument | No | r2 and r3 are used for passing the second two arguments to functions. There values after a function is called can be anything. | r3 | Argument | No | r4 | General purpose | Yes | r4 to r12 are used for working values, and their value after a function is called must be the same as before. | r5 | General purpose | Yes | r6 | General purpose | Yes | r7 | General purpose | Yes | r8 | General purpose | Yes | r9 | General purpose | Yes | r10 | General purpose | Yes | r11 | General purpose | Yes | r12 | General purpose | Yes | lr | Return address | No | lr is the address to branch back to when a function is finished, but this does have to contain the same address after the function has finished. | sp | Stack pointer | Yes | sp is the stack pointer, described below. Its value must be the same after the function has finished.
|
通常的功能需要使用更多的寄存器R0到R3比。但是,由于R4至R12的方法运行后必须保持不变,他们必须保存起来。我们把它们保存在所谓的堆栈。
由于堆栈是非常有用的,它已经在ARMv6指令集的直接实现。一个特殊的寄存器称为SP(堆栈指针)对堆栈的地址。当项目被添加到堆栈,SP寄存器的更新,所以它总是保持第一项堆栈上的地址。推{ R4,R5 }将R4和R5的值到堆栈的顶部和流行{ R4,R5 }会带他们回来了(以正确的顺序)。
|
|