Assembly 用拇指指令使用常量值

Assembly 用拇指指令使用常量值,assembly,arm,cortex-m,Assembly,Arm,Cortex M,我的问题与可能用于拇指编码的常量值有关 我使用的是armv7指令集 参考手册指出,在thumb中写入指令时可以使用的常量被编码为12位编码,psudocodeThumbExpandImm()(ARM的ARM中的233页)描述了编码过程以及可以与指令一起使用的可能常量 I am trying to generate the constants values that are possible with the instruction using the process described by `

我的问题与可能用于拇指编码的常量值有关

我使用的是
armv7
指令集

参考手册指出,在thumb中写入指令时可以使用的常量被编码为12位编码,psudocode
ThumbExpandImm()
(ARM的ARM中的233页)描述了编码过程以及可以与指令一起使用的可能常量

I am trying to generate the constants values that are possible with the instruction using the process described by `ThumbExpandImm()` .
当常量的
12位编码的
位不等于
'00'
,在这种情况下,手册说明数字表示为带旋转的立即值

当我生成这些数字并尝试组装时,assembler发出一条消息:

“不能用0-255左移0-23表示,也不能用全部、奇数或偶数字节表示”

我不明白为什么汇编器说的是左移,而手动说的是旋转。
我还想知道使用这种方案进行编码背后的想法,因为很难确定编码中是否允许使用我心目中的常量值

if imm12<11:10> == ‘00’ then
....
else
unrotated_value = ZeroExtend(‘1’:imm12<6:0>, 32);
(imm32, carry_out) = ROR_C(unrotated_value, UInt(imm12<11:7>));
return (imm32, carry_out);
根据错误消息,我猜您正在使用其他东西,但这不会影响编码

00000000 <.text>:
   0:   2001        movs    r0, #1
   2:   2002        movs    r0, #2
   4:   2003        movs    r0, #3
   6:   f240 1523   movw    r5, #291    ; 0x123
   a:   f240 1623   movw    r6, #291    ; 0x123
   e:   f240 1723   movw    r7, #291    ; 0x123
  12:   f240 0076   movw    r0, #118    ; 0x76
  16:   f640 0076   movw    r0, #2166   ; 0x876
  1a:   f45f 5000   movs.w  r0, #8192   ; 0x2000
  1e:   f45f 4080   movs.w  r0, #16384  ; 0x4000
  22:   f45f 4000   movs.w  r0, #32768  ; 0x8000
右边还有一个给出0x00004000,这是我们想要的常数

所以基本上你的常数必须用一个1来表示,它有7位可供选择,可以在0b01000和0b11111(8和63)之间向右旋转

0x00000090向右旋转(10111)23

0x00009000是24的旋转,因此0x00012000是23的旋转

或者将其视为0x00000090向左旋转32-23=9

向左旋转的8为0x00009000,因此9为0x00012000

   4:   f45f 2009   movs.w  r0, #561152 ; 0x89000
0x00000089向左旋转32-20=12(10100)


0x00000089从只有一个非零位的常数开始,1,2,4,8等。然后尝试一些2位的3,6,0xC等,看看thumb汇编程序为机器代码生成什么,然后将其与ARM进行比较。ARM确实解释了它是如何工作的。“很难弄清楚编码中是否允许使用我心目中的常量值”。如果您使用十六进制表示法写入常量,则应清楚它们是否满足要求。您是否注意到常量值的第7位必须是1?请看ARM第A5.3.2节中给出的示例。本主题已经在这里介绍过了。@JoeHass是的,我已经看到第7位被视为一位,第7位连同位一起被用作旋转量的值。但我的问题是汇编程序的错误消息,它是关于左移位的,并且给了我0-23的限制。我在文档中找不到此项。很抱歉,响应太晚。我离开电脑有很长一段时间了。谢谢你的详细解释。我发现那是我的错。我在实现生成这些拇指常数的方程式时犯了一个错误,结果它生成了无法表示的数字。
00000080 
00 000080 
000080 00 
0x00008000
  0:    f45f 3090   movs.w  r0, #73728  ; 0x12000
   4:   f45f 2009   movs.w  r0, #561152 ; 0x89000
   f45f 7099    movs.w  r0, #0x132
   f45f 7019    movs.w  r0, #0x264
   f45f 6099    movs.w  r0, #0x4c8
   f45f 6019    movs.w  r0, #0x990
  f241 2034     movw    r0, #0x1234
case imm12<9:8> of
when ‘00’
imm32 = ZeroExtend(imm12<7:0>, 32);
when ‘01’
if imm12<7:0> == ‘00000000’ then UNPREDICTABLE;
imm32 = ‘00000000’ : imm12<7:0> : ‘00000000’ : imm12<7:0>;
when ‘10’
if imm12<7:0> == ‘00000000’ then UNPREDICTABLE;
imm32 = imm12<7:0> : ‘00000000’ : imm12<7:0> : ‘00000000’;
when ‘11’
if imm12<7:0> == ‘00000000’ then UNPREDICTABLE;
imm32 = imm12<7:0> : imm12<7:0> : imm12<7:0> : imm12<7:0>;
  f05f 0099     movs.w  r0, #0x00000099
  f05f 1099     movs.w  r0, #0x00990099
  f05f 2099     movs.w  r0, #0x99009900
  f05f 3012     movs.w  r0, #0x12121212
  f05f 3089     movs.w  r0, #0x89898989