anole 发表于 2006-11-10 00:03:52

本人翻译的《ARM架构参考文档》,有感兴趣的进来看看!

刚刚开始译啦!是因为找不到现成的才出此下策,不过也可以把知识学的更扎实些。刚刚译完《ARM指令集简介》那个章节,贴出来给大家看看,译的不好,多提点意见!

1.2 ARM指令集
ARM指令集主要可以分为6类:
        分支指令
        数据处理指令
        状态寄存器转换指令
        装载和保存指令
        协处理器指令
        异常生成指令
多数的数据处理指令和一种协处理器指令会根据其执行的结果更新CPSR寄存器中的条件码标准位(Negative,Zero,Carry 和 oVerflow)。
        几乎所有的ARM指令都包含一个4比特的条件域,这个域中的一个值指定指令无条件执行。
        此域的其他14个值指定执行条件。如果条件码标志指定的条件为真则此指令执行,否则什么也不做。这14个条件允许:
        测试是否相等
        测试是否小于,小于等于,大于和大于等于,适用于有符号和无符号数的算术运算
        每个条件码都会被单独验证。
第16个值被用于少数不允许条件执行的指令。
1.2.1 分支指令
        ARM架构在允许许多数据处理或装载指令通过写PC来改变控制流的同时,也提供一种标准的分支指令,此指令将一个24比特无符号位移值作为参数,并允许其执行向前或向后的32MB范围内的分支操作。
        分支指令BL会将此分支指令后的那条指令地址保留到R14(LR)中,子例程的调用可以通过将LR中的值拷贝到PC中来实现返回操作。
        还有一些分支指令同时可以达到切换指令集的目的,因此分支目标处就可以执行Thumb指令集的指令。这就允许ARM代码去调用Thumb子例程,ARM子例程也可以返回到它的Thumb调用者。Thumb指令集中的类似指令也允许相应的Thumb->ARM的切换。Thumb指令集的概述信息可以在A6章节Thumb指令集中找到。
1.2.2 数据处理指令
        数据处理指令在通用寄存器上执行计算工作。有四类数据处理指令:
        算术/逻辑指令
        比较指令
        乘指令
        前端0值个数计算指令(A1-7)
算术/逻辑指令
        有12个算术/逻辑指令,它们都遵循同样的指令格式。这些指令在一个或最多两个操作数直间执行算术或逻辑运算,并将结果写入一个目标寄存器。同时也可以根据结果更新条件码标志。
当有两个操作数时:
                其中一个永远是寄存器
                另一个有两种基本形势:
                        ―― 一个立即数
                        ―― 一个寄存器值,并且可同时进行移位操作
        如果操作数是一个移位后的寄存器值,那么移位的数量可以是一个立即数也可以是另外一个寄存器的值。可以指定4种类型的移位。因此每个算术/逻辑指令都可以执行一个算术/逻辑运算和移位操作。所以ARM没有独立的移位指令。
        因为Program Counter (PC)是一个通用寄存器,算术/逻辑运算指令可以直接写入PC。这就允许不同的跳转指令的实现。

比较指令
        有4种比较指令,它们使用与算术/逻辑指令相同的格式。这些指令对两个操作数执行算术或逻辑运算,但是并不将结果写入寄存器。它们总是会根据结果更新条件标志位。
        比较指令的源操作数使用和算术/逻辑指令相同的格式,包括混合一个移位操作的能力。

乘法指令
        乘法指令分为两类。这两类指令都可以将两个32比特寄存器值相乘并保存结果为:
                32比特结果 一般情况。将32位结果保存在一个寄存器中。
                64比特结构 加长(Long)。将64比特结果保存在两个分离的寄存器中。
        两种类型的乘法指令都可以执行一个累加操作。
前端0值个数计算指令
前端0值个数计算(CLZ)指令用于确定一个寄存器中保存值的大尾数端的0的个数,直到第一个1比特。执行的结果会被写入CLZ指令的目的寄存器中。
1.2.3 状态寄存器传输指令
        状态寄存器传输指令将CPSR或SPSR寄存器的值从状态寄存器传输到一个通用寄存器或反之。写入CPSR时可以:
        设置条件标志位的值
        设置中断使能位
        设置处理器模式。
1.2.4 装载和保存指令
        如下的装载和保存指令是可用的:
        装载和保存寄存器
        装载和保存多个寄存器
        交换寄存器和存储器的内容
装载和保存寄存器
        装载寄存器指令可以从存储器向寄存器装载一个32比特字,一个16比特半字或一个8比特字节。字节和半字可在其被装载的同时自动进行0扩展和符号扩展。
        保存寄存器指令可从一个寄存器向存储器保存一个32比特字,一个16比特半字或一个8比特字节。
        装载和保存寄存器指令有三种首选地址模式,所有模式都使用一个基址寄存器和一个位移来指定。
        在位移寻址中,存储器地址由一个基址寄存器值加上或减去一个位移值得到。
        在预索引寻址中,存储器地址的组成方式和位移寻找相同,只是有一个副作用,存储器地址也被回写到了基址寄存器中。
        在后索引寻找中,存储器地址是基址寄存器的值。其副作用是基址寄存器的值加上或减去一个位移值后会被回写如基址寄存器。
(译者注) 即把字节或半字头部的0扩展到一个字的最高端,或把符号位移到一个字的最高端。

在每种情况下,位移值可以是一个立即数或一个索引寄存器的值。基于寄存器的位移也可以附加一个移位操作。
        由于PC是一个通用寄存器,一个32比特值可以直接装载入PC中从而实现在4G存储器空间中的任意跳转。

装载和保存多个寄存器
        装载多个(LDM)和保存多个(STM)寄存器指令执行一个从任意数量的寄存器到存储器或反之的块传输操作。提供了四种寻址模式:
        预递增
        后递增
        预递减
        后递减
        基址由一个寄存器值指定,这个寄存器的值可以在传输后更新。由于子例程返回地址和PC的值保存在通用寄存器中,可以使用LDM和STM指令构造高效的子例程入口和退出指令序列:
        在子例程入口处可使用一个单独的STM指令将寄存器内容和返回地址保存到堆栈中,然后更新进程中的堆栈指针。
        在子例程出口处可使用一条单独的LDM指令来从堆栈恢复寄存器的值,向PC中装载返回地址,并更新堆栈指针。
        使用LDM和STM指令还可以构造出高效的块拷贝指令序列或相似的数据移动算法。

交换寄存器和存储器的内容
        一个交换(SWP)指令执行以下的操作序列:
1、        从存储器指定的位置装载一个值。
2、        保存一个寄存器值到相同的存储器位置。
3、        将第一部中装载的值写入一个寄存器中。
通过在第二步和第三步中设置相同的寄存器,一个存储器位置中的内容和寄存器中的内容就被交换过来了。
这种交换操作执行了一个特殊不可见的总线操作,此操作允许对于信号量的原子更新。此操作同时支持32比特和8比特的信号量。
1.2.5 协处理器指令
        有三种类型的协处理器指令:
        数据处理指令
                开始一个协处理器特定的内部操作。
        数据传输指令
                将协处理器中数据传送到存储器或反之。传输地址由ARM处理器计算。
        寄存器传输指令
                允许一个协处理器值被传送到ARM寄存器或反之。
1.2.6 异常产生指令
        有两种类型的指令是被设计用来产生特定的异常。
        软件中断指令
SWI指令导致一个软中断异常的发生。这通常被用来进行一个系统调用,来请求一个系统定义的服务。当进入一个SWI指令造成的异常的同时处理器也会切换到特权模式。这就允许非特权任务得到特权函数的访问权,但只以操作系统允许的方式进行。
软件断点指令
BKPT指令导致一个中止异常的发生。如果在中止向量处安装了合适的调试器软件的话,以这种方式产生的异常被当作断点对待。如果系统中存在调试硬件的话,BKPT指令也可以被直接看作一个断点,而不是导致一个中止异常。
        另外,如下类指令会导致一个未定义指令异常发生:
        出现了不能被任何协处理器硬件识别的协处理器指令。
        多数的指令字没有按照ARM指令规定的方式排布。
        在以上任何一种情况下,此异常通常用来产生一个合适的错误或初始化软件模拟指令。
页: [1]
查看完整版本: 本人翻译的《ARM架构参考文档》,有感兴趣的进来看看!