먼저 infocenter.arm.com에서 ARM 아키텍처 참조 설명서 (ARM ARM)가 필요하며 참조 설명서는 가장 오래된 것 (armv5 또는 무엇이든). 명령어 세트는 거기에 잘 정의되어있다.
두 번째 이유는 몇 가지 지침을 조합하고 어떤 결과가 발생하는지 보지 않겠습니까?
;@test.s
cmp r1, r0
add r0, #0x1a
어떤 크로스 어셈블러 당신이 (그냥 스크립트에서 바이너리 유틸리티를 통해 최대 실행 스크립트의 빌드 GCC 디렉토리에 http://github.com/dwelch67/raspberrypi 참조) 팔걸이 대
arm-none-linux-gnueabi-as test.s -o test.o
arm-none-linux-gnueabi-objdump -D test.o
팔 - 없음 - 리눅스 - gnueabi 그럼에도 ELF 등 아암 ELF VS 모두가 전체 32 비트 ARM 명령어 (되지 엄지) 조건 코드는 동일한
Disassembly of section .text:
00000000 <.text>:
0: e1510000 cmp r1, r0
4: e280001a add r0, r0, #26
상위 4 비트를 수행 이것을 아무리 말아, 상태 필드 표시 섹션을 참조하십시오. 0xE는 항상이 명령어를 실행한다는 것을 의미합니다. 0b0000은 z 플래그가 설정되어있는 경우에만 실행되며, 0b0001은 ne가 z가 클 경우에만 실행됩니다.
ARM에서 ARM 명령 세트로 푸시 한 다음 팔 명령의 알파벳 순 목록을 클릭 한 다음 cmp를 찾습니다. cond 00I10101 rn sbz shifter
위의 cmp 명령에서 우리는 1110 000101010001을 볼 수 있습니다. 그래서 저는 0 비트입니다 15:12는 0 비트이고 27:26은 0이고 24:21은 1010이므로 이것은 cmp입니다. 명령어
위의 비트 19 ~ 16은 0b001입니다. ARM ARM의 시프터 피연산자에 대해서는 rn = rn = 1 (r1)이므로 어드레싱 모드 1 데이터 처리 피연산자를 살펴보고 pdf에서 페이지
우리는 두 번째 피연산자를 단순히 데이터 처리 피연산자 레지스터라고 부르는 레지스터로 알고 페이지 번호는 해당 페이지의 해당 페이지로 이동합니다. 15:12는 rrd 11 : 4는 0이고 3은 3입니다. : 0은 rm입니다. 우리는 cmp 명령에서 15:12이 0이어야한다고 말합니다. 걱정할지라도 cmp는 결과를 레지스터에 저장하지 않으므로 rd는 사용되지 않습니다. rm이 사용되고 r0을 원한다면 0b0000은 3 : 0이됩니다. 또한 cmp 명령 25에서 비트 27:25가 0으로 표시됩니다. 이제 우리는 0을 원한다는 것을 알 수 있습니다.
CMP에 페이지와이 데이터 처리와
- 등록 페이지에서 우리는 전체 그림
1110 condition
000
1010 opcode
1 S (store flags, that is a 1 for a cmp to be useful)
0001 rn
0000 rd/dont care/sbz
00000
000
0000 rm
cmp rn,rm
cmp r1,r0
추가 기능이 비슷하지만 즉시 사용이 있으므로 지침의 알파 목록에 추가 명령어로 이동합니다. 우리는 이제 cmp로부터이 클래스의 24:21이 opcode임을 알 수 있습니다. 우리는 계속 shifter 피연산자 항목으로 바로 넘어갈 수 있습니다.
이번에는 rd, rn, # immediate를 추가합니다.
그렇게 #immediate
의 페이지를 찾아 및 인코딩은
1110 condition, always
001 (note the immediate bit is set)
0100 (opcode for add for this type of instruction)
0 (S not saving the flags, it would be adds r0,r0,#26 for that)
0000 (rn = r0)
0000 (rd = r0)
이제 흥미로운 부분은, 우리는 26 개 가지 방법을 인코딩 할 수 온다.비트 7 : 0은 즉시이고 비트 11 : 8은 즉각적인 회전을 허용하고, 26은 0x1A입니다. 단순히 0x1A를 하위 8 비트에 넣고 회전을 0으로 설정하면 gnu 어셈블러가 수행 한 것입니다. 아마도 0x8을 하위 8 비트에 넣을 수 있으며 rotate_imm 필드의 1은 1101000 = 1101000 = 오른쪽으로 1 * 2 회전합니다.
큰 질문; 불행히도 링크가 죽었습니다. 지나가는 사람들을위한 빠른 [웹 아카이브 링크] (https://web.archive.org/web/20150426195854/http://www.nyx.net/~troddis/ARM.html) – Asu