내가
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);
그래서 이것을 시도 ... 이것에 당신을 도울 것입니다, 이것은 GNU 어셈블러이다. f45f 4080 MOVS를 :
나는 당신이 당신의 오류 메시지를 기반으로 다른 것을 사용하고 있지만 나던 인코딩에 영향을 추측하고
.syntax unified
.thumb
movs r0,#1
movs r0,#2
movs r0,#3
movw r5,#0x123
movw r6,#0x123
movw r7,#0x123
movw r0,#0x076
movw r0,#0x876
movs.w r0,#0x2000
movs.w r0,#0x4000
movs.w r0,#0x8000
...
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
이 하나
1E에게 가져 가라. w r0, # 16384; 0x4000으로
I = 1, imm3 = 0b100, IMM8 = 0b10000000
imm12은 0xC80이다 11시 10분가 0b00와 같지 0b11를되는 비트이므로
회전하지 않은 값 = ZeroExtend (0b100000000) = 0x00000080 표시 = imm32의 ROR (0x00000080,0b11001) = 용 ROR (0x00000080,25)
(24)의 회전은 바로 오프 6 니블을 가지고 왼쪽
00000080
00 000080
000080 00
0x00008000
,369,136로 이동하는 것3210
그리고 오른쪽으로 한 번 더 우리의 원하는 상수 인 0x00004000을 제공합니다.
때문에 기본적 상수 오른쪽
0: f45f 3090 movs.w r0, #73728 ; 0x12000
0x00000090 오른쪽 (10111) 23
회전 0b01000 및 0b11111 (8, 63) 사이에서 회전 할 수있는 선택의 1 7 비트로 표현 될 수있다
0x00009000 정도로 0x00012000 23.
의 회전이거나가 0x00000090 = 9
32-23 왼쪽으로 회전이라고 생각할 (24)의 회전 인 왼쪽으로 8 회전하면 0x00009000이므로 9는 0x00012000입니다.
4: f45f 2009 movs.w r0, #561152 ; 0x89000
0x00000089은 왼쪽으로 회전
0x00000089 < < 12 (10100) = 12
32-20 = 0x00089000
이 거의 ARM 인코딩과 동일하다. 기본적으로 0x00과 0xFF 사이의 숫자를 가져 와서 상수를 얻기 위해 왼쪽으로 이동하면 원하는 상수를 사용할 수 없습니다. 또는 그것을보아야 할 또 다른 방법은 가장 중요한 0이 아닌 값과 최소값 사이의 거리입니다. 8 비트 이상 떨어져 있으면이 회전이 진행되는 한 작동하지 않을 것입니다.
이들 모두는 양쪽에 0이있는 비트 패턴 10011001을 가지며 인코딩 할 수 있습니다. MOV 명령어에 대한 지금
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
를 너무 오래 당신이하고 싶지 해달라고으로 16 비트 즉시 incoding이 있기 때문에 movs. 당신이 movs를 원한다면 당신은 imm16 상황이 아니라 imm12 상황을 가지고 있습니다. 그것은 imm16을 가지고 있으며, 그것은 또한 이러한 다른 변화를 가지고 있기 때문에
thumb2 인코딩은 팔 인코딩보다 훨씬 더 유연 :
당신이 그것을 말한다 팔 문서에 같은 장소에 보면 경우 imm12 [11 : 10 = 00
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>;
정도로 [9 : 8] 00의 우리 255
f05f 0099 movs.w r0, #0x00000099
'01'의 경우 0부터 번호를 가질 수 있다는 것을 의미에서 임의의 번호를 의미 1에서 255까지이지만 sa 저 수가 판정을 갖는다 [7 : 0] 상수
f05f 1099 movs.w r0, #0x00990099
'10'의 경우에 [23시 16분] 위치에 1 내지 255의 숫자를 의미하지만, 그 개수에이어야 에서 [31:24] 및 : 수
f05f 2099 movs.w r0, #0x99009900
및 '11'의 경우, 1 내지 255의 숫자이지만 동일한 번호 [15 (8)]의 위치는 네 바이트이어야
f05f 3012 movs.w r0, #0x12121212
f05f 3089 movs.w r0, #0x89898989
0이 아닌 비트, 1,2,4,8 등이있는 상수로 시작한 다음 몇 가지 2 비트를 시도하십시오. 3 , 6,0xC 등을 사용하고 엄지 어셈블러가 기계 코드를 위해 생성하는 것을 확인한 다음 ARM ARM과 비교해보십시오.ARM ARM은 어떻게 작동하는지 설명합니다. –
_ "내가 사용하고자하는 상수 값이 인코딩에서 허용되는지 여부를 알아내는 것은 어려울 것입니다."_ 16 진수 표현을 사용하여 상수를 작성하는 경우 요구 사항을 충족하는지 여부가 명확해야합니다. – Michael
상수 값의 비트 7이 1이어야 함을 알아 챘습니까? ARM ARM에서 A5.3.2 절에 나와있는 예제를 살펴보십시오. –