臂指令的一个总线指令

时间:2015-02-16 16:53:25

标签: assembly arm machine-code

我目前正在尝试使用ARM处理器计算每个时钟周期的一条指令。我已经两次介绍这些概念,但还没有找到任何正确教导它的人。目前我正在试图找出说明:

1)。 LSR R0,R1,#2; 2)。 cmp R5,R6;

我需要确定机器代码,然后在一台总线机器上安排上述说明。

感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

机器代码

The ARM Architecture Reference Manual指定机器代码以获取指令。第A7-68页描述了具有立即输入的LSR指令的格式。

//I can't post an image because of low reputation
Bit - 15 14 13 12 11 | 10           6 | 5     3 | 2     0
Val -  0  0  0  0  1 |     immed_5    |    Rm   |   Rd

Syntax
LSR <Rd>, <Rm>, #<immed_5>
where:
<Rd> Is the destination register for the operation.
<Rm> Is the register containing the value to be shifted.
<immed_5> Specifies the shift amount, in the range 1 to 32. 
Shifts by 1 to 31 are encoded directly in immed_5.
A shift by 32 is encoded as immed_5 == 0.

根据您的指示immed_5 = 00010, Rm = 001, and Rd = 000

所以二进制指令是:00001 00010 001 000

或十六进制:0x0111


一个总线调度

在一个总线机器上调度指令的目的是指定哪些寄存器将数据放在总线上,哪些寄存器正在从总线读取数据,以及应该以什么顺序发生这种情况。要记住的一件重要事情是,一次只能在总线上放一个值。

以下是使用您的第一条指令进行安排的示例。这使用X作为ALU输入寄存器,Y作为ALU输出寄存器。这也假设ALUsll将使总线上的值移位存储在X中的值。

LSR R0,R1,#2

将指令输入指令寄存器

  1. PCout,MARin,MEMread
    访问当前指令的存储位置
  2. MDRlatch
    将值从内存加载到MDR
  3. MDRout,IRin
    让指令进入指令寄存器
  4. 执行指令特定操作

    1. IRimmediateout,辛
      将指令中的立即值(#2)放入X
    2. R1out,ALUsll,Yin
      将R1中的值放在总线上,告诉ALU移位,并将结果存储在Y
    3. Yout,R0in 将结果存储到R0
    4. 使PC进入下一条指令

      1. PCout,SetXto2,ALUadd,Yin
      2. Yout,PCin

      3. 您可以使用这些相同的方法来确定任何其他ARM指令的机器代码转换和单总线调度。