2013-07-28 2 views
0

제 질문은 엄지 인코딩에 가능한 상수 값과 관련되어 있습니다.엄지 손가락 명령으로 상수 값 사용하기

ARM v7 명령어 세트로 작업하고 있습니다.

레퍼런스 매뉴얼에서는 지침을 쓰는 동안 사용할 수있는 상수를 12 비트 인코딩으로 인코딩하고 psudocode ThumbExpandImm() (ARM의 ARM에서는 233 페이지)에 인코딩 프로세스 및 사용할 수있는 가능한 상수를 설명합니다 지시. 비트 상수 12 bit 인코딩 <11:10> 수동이 수가 회전 치값로 표현되는 것을 밝히는 경우 '00' 같지 않은 경우 마지막 가능성

I am trying to generate the constants values that are possible with the instruction using the process described by `ThumbExpandImm()` . 

I는 데 문제가 언급. 수동 회전 말한다 동안 어셈블러 왼쪽 시프트에 대해 이야기 왜 이해가 안

“cannot be represented by 0-255 shifted left by 0-23 or duplicated in all, odd or even bytes”

:

나는 그런 숫자를 생성하고 조립하려고, 어셈블러는 메시지를 제공합니다. 나는 인코딩에서 허용되는 상수 값인지 여부를 알아내는 것이 어려울 것이므로 이러한 구성표로 인코딩하는 아이디어에 대해 궁금합니다.

+0

0이 아닌 비트, 1,2,4,8 등이있는 상수로 시작한 다음 몇 가지 2 비트를 시도하십시오. 3 , 6,0xC 등을 사용하고 엄지 어셈블러가 기계 코드를 위해 생성하는 것을 확인한 다음 ARM ARM과 비교해보십시오.ARM ARM은 어떻게 작동하는지 설명합니다. –

+0

_ "내가 사용하고자하는 상수 값이 인코딩에서 허용되는지 여부를 알아내는 것은 어려울 것입니다."_ 16 진수 표현을 사용하여 상수를 작성하는 경우 요구 사항을 충족하는지 여부가 명확해야합니다. – Michael

+0

상수 값의 비트 7이 1이어야 함을 알아 챘습니까? ARM ARM에서 A5.3.2 절에 나와있는 예제를 살펴보십시오. –

답변

1

내가

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

늦게 응답하여 죄송합니다. 나는 오랫동안 컴퓨터를 벗어났다. 자세한 설명 주셔서 감사합니다. 실수가 내 부분에 있다는 것을 알았습니다. 그런 엄지 상수를 생성하기위한 방정식을 구현하는 데 실수를했습니다. 결과적으로 표현할 수없는 숫자가 생성되었습니다. – Gautam

관련 문제