第5部分- Linux ARM汇编 ARM 架构细节

论坛 期权论坛     
选择匿名的用户   2021-5-31 01:29   276   0
<h1 style="margin-left:0cm;">第5部分- Linux ARM汇编 ARM 架构细节</h1>
<p style="margin-left:0cm;">ARM处理器有37个寄存器,包括31个通用寄存器,和6个状态寄存器。</p>
<p style="margin-left:0cm;">通用寄存器是31个从x0-x30,31个数量是比较奇怪的,其实还有一个是<em>Zero Register</em>是wzr。如果是使用寄存器中的32位,就是w0-w30了。类型X86中的rax和eax寄存器,一个64位一个32位。</p>
<p style="margin-left:0cm;">ARM处理器共有7种不同的处理器模式,在每一种处理器模式中有一组响应的寄存器组。</p>
<p style="margin-left:0cm;">在AArch64时使用X30作为子函数调用时使用的link register</p>
<p style="margin-left:0cm;">在AArch32时始终使用LR作为link register。</p>
<h2 style="margin-left:0cm;">ARM64通用寄存器</h2>
<p style="margin-left:0cm;">后续主要都是ARM64架构了,所以这里以arm64例。</p>
<table border="1" cellspacing="0"><tbody><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Register</p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Volatile?</p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;">Role</p> </td></tr><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">x0</p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Volatile</p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;">Parameter/scratch register 1, result register</p> </td></tr><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">x1-x7</p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Volatile</p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;">Parameter/scratch register 2-8</p> </td></tr><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">x8-x15</p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Volatile</p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;">Scratch registers</p> </td></tr><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">x16-x17</p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Volatile</p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;">Intra-procedure-call scratch registers</p> </td></tr><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">x18</p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Non-volatile</p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;">Platform register: in kernel mode, points to KPCR for the current processor; in user mode, points to TEB</p> </td></tr><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">x19-x28</p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Non-volatile</p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;">Scratch registers</p> </td></tr><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">x29/fp</p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Non-volatile</p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;">Frame pointer</p> </td></tr><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">x30/lr</p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;">Non-volatile</p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;">Link registers</p> </td></tr><tr><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;"> </p> </td><td style="vertical-align:top;width:138.15pt;"> <p style="margin-left:0cm;"> </p> </td><td style="vertical-align:top;width:138.2pt;"> <p style="margin-left:0cm;"> </p> </td></tr></tbody></table>
<p style="margin-left:0cm;">可以通过w0 ~ w30来访问这31个64位寄存器的低32位,写入时会将高32位清零。</p>
<p style="margin-left:0cm;"><img alt="" height="209" src="https://beijingoptbbs.oss-cn-beijing.aliyuncs.com/cs/5606289-942a9d02977b730b59529a42fb824724.png" width="415"></p>
<h2 style="margin-left:0cm;">ARM64浮点寄存器</h2>
<p style="margin-left:0cm;">也是有32个浮点寄存器。</p>
<p style="margin-left:0cm;">每个寄存器都可以作为完整的128位值(通过v0-v31或q0-q31)进行访问。 可以以64位值(通过d0-d31),32位值(通过s0-s31),16位值(通过h0-h31)或8位值进行访问 (通过b0-b31)。 小于128位的访问仅访问整个128位寄存器的低位。 除非另有说明,否则它们保持其余位不变。 (AArch64与AArch32不同,在AArch32中,较小的寄存器封装在较大的寄存器的顶部。)</p>
<ul><li>32个B寄存器(B0~B31),8bit</li><li>32个H寄存器(H0~H31),半字 16bit</li><li>32个S寄存器(S0~S31),单子 32bit</li><li>32个D寄存器(D0~D31),双字 64bit</li><li>32个Q寄存器(V0~V31),四字 128bit</li></ul
分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP