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位编码,psudocodeThumbExpandImm()
(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