2011-11-07 4 views
3

저는 12000으로 레지스터를 설정하려고합니다. MOV가 255보다 큰 값을 넣을 수 없으므로 12000/2^8 = 375라고 생각합니다. 그러나 375는 여전히 너무 크고 2로 나눌 수 없습니다. 메모리에 12000을 저장하는 것이 유일한 것입니까? 훨씬 덜 효율적입니까?암에 많은 수를 표현합니다.

기호가 없으므로 왜 255가 아니라 256이 아닌가요?

답변

5

어떤 ARM 아치를 타겟팅합니까? 하는 ARMv7에서 아주 좋은 해결책이합니다 - movw 명령하는 16 비트 즉시 취

movw r0, #12000 

ARMv7 이전에, 당신은 두 단계를 사용할 필요가 :

mov r0,  #0x00002e00 
orr r0, r0, #0x000000e0 

주를이 표현 가능한 즉시는 8 비트 폭만이 아니다; 그것들은 짝수 오프셋에 의해 회전 된 8 비트입니다. 또는 즉시 값을 사용하는 대신 메모리에서 값을로드하기 만하면됩니다. 전통적으로 팔

+0

1) 왜 2e00이 적합합니까? 2) 어떻게 2e00을 생각해 냈습니까? –

+0

@ quest4knoledge :'0x2e00'은 짝수 오프셋 * (8)에 의해 회전 된 * 8 비트 * ('0x2e') *이기 때문에 적합합니다. 나는 16 진수 (0x2ee0)로 12000을 인쇄하고 그것을 표현할 수있는 두 개의 필드로 나누었습니다. 정확한 분할은 중요하지 않습니다. 또한 '0x2000' 및'0x0ee0' 일 수도 있고 차이는 없습니다. –

+0

설명해 주셔서 감사합니다. –

1

바이너리의 8 비트 수가 00000000-11111111에서부터 나오기 때문에 255입니다. 11111111은 십진수 255입니다. XOR을 사용하여 MOV 대신 레지스터간에 값을 바꿀 수 있습니다. 그것은 더 빠른 경향이 있습니다.

4

스티븐 지적 정도로 12000 = 0x2EE0, 당신은 다음이 할 수있는, 8 또는 9 비트의 전환을 허용 : 빠른 바로 가기로

mov r0, #0x2E00 
orr r0, #0x00E0 

또 다른 방법입니다 :

어셈블러는 다음의 PC 상대 하중을 그 값을 넣어 장소를 찾을 수 있습니다 또는 당신이 할 수 있다는 것을 의미
ldr r0,=0x2EE0 

자신은 :

ldr r0,mynumber 
... 
mynumber: .word 12000 

명령어 세트에 대한 새로운 확장으로 인해 즉각적인 명령어에서 더 많은 비트가 허용됩니다. 나는 일반적으로

ldr r0,=0x2EE0 

솔루션을 사용하고 어셈블러 변수를 배치 할 수 나는 기본적으로 풀을 무조건 지점을 가지고 있는지 확인하십시오. 컴파일러는 일반적으로 똑같은 일을합니다. 즉, 한 명령에서 즉각적으로 맞지 않으면 여러 개의 즉각적인 명령보다는 PC 상대적인로드를 사용하는 경향이 있습니다.

+0

첫 번째 해결 방법은 0x2E00을 어떻게 선택 했습니까? 그것은 r0에 맞을 수있는 최대 숫자이기 때문입니까? 많은 추측과 확인처럼 보입니다. –

+0

바이트 경계를 따라 부서지면 읽는 것이 더 쉬워집니다. 0x1234가 있으면 0x1000과 0x234를 할 수 있지만 0x12xx와 0xxx34는 읽기 쉽고 구현하기가 쉽습니다. 0x12345678 -> 0x12000000, 0x00340000, 0x00005600, 0x00000078. 기본적으로 바이트로 나눕니다. –

2

32 비트의 32 비트가 즉 치값에 할당됩니다.

는 8 비트 패턴을 결정하고, 나머지 4 비트 패턴의 위치 16 : 8 비트 패턴은 8 비트 세트에 넣고

0x000000ff 
0x000003fc 
0x00000ff0 
0x00003fc0 
0x0000ff00 
0x0003fc00 
0x000ff000 
0x003fc000 
0x00ff0000 
0x03fc0000 
0x0ff00000 
0x3fc00000 
0xff000000 
0xfc000003 
0xf000000f 
0xc000003f 

.

위의 순서는 실제 4 비트 값과 일치하지 않습니다. 어떤 이유로 든 런타임에 자체 수정 코드를 작성하려는 경우가 아니면 실제로 그런 종류의 물건을 알 필요가 없습니다.

당신이 R0으로 모든 32 비트 값을로드하려면, 어셈블러는 다음 가장 효율적인 하나에이 변환됩니다 = 0x12345678

'='

LDR r0을 가진 의사의 지시 LDR을 (사용 컴파일 타임에 아키텍처에 따라 다르다.

관련 문제