STM32F0 (ARM Cortex M0) 마이크로 컨트롤러 용 (ARMv6-M) 어셈블러를 배우고 있습니다. 우선, 나는 등록 초기화 스크립트 작성 r0
에 0
와 r1
에 1
, 마지막 r0
으로 증가 1
루프에 있습니다. 디버거, 즉를 gdb
사용 si
하여 한 단계를 실행 info reg
하고 레지스터를 출력하는 데 사용할 수 있습니다 . 어셈블러 코드는 다음과 같습니다.
.syntax unified
.cpu cortex-m0
.fpu softvfp
.thumb
.global vector_table
.global reset_handler
.type vector_table, %object
vector_table:
.word _estack
.word reset_handler
.type reset_handler, %function
reset_handler:
LDR r0, =0
LDR r1, =1
main_loop:
ADDS r0, r0, 1
B main_loop
이 훌륭한 튜토리얼을 기반으로 합니다 .
.type x
매크로를 제거 할 때 디버거를 통해 레지스터에 변경 사항이 표시되지 않지만 이.type
스택 오버플로 게시물에 따르면 -macro는 효과가 없습니다.
왜 등록을 r0
하고 r1
내가 제거 할 때 일정하게 유지 .type
-macros를?
.syntax unified
.cpu cortex-m0
.fpu softvfp
.thumb
.global vector_table
.global reset_handler
.type vector_table, %object
vector_table:
.word 0x20001000
.word reset_handler
.type reset_handler, %function
reset_handler:
LDR r0, =0
LDR r1, =1
.type 함수 사용
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4800 ldr r0, [pc, #0] ; (100c <reset_handler+0x4>)
100a: 4901 ldr r1, [pc, #4] ; (1010 <reset_handler+0x8>)
100c: 00000000 andeq r0, r0, r0
1010: 00000001 andeq r0, r0, r1
재설정을위한 벡터 테이블에는 1 0x1009의 적절한 주소 ORRed가 있습니다. 함수 선언을 제거하면
disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001008 andeq r1, r0, r8
00001008 <reset_handler>:
1008: 4800 ldr r0, [pc, #0] ; (100c <reset_handler+0x4>)
100a: 4901 ldr r1, [pc, #4] ; (1010 <reset_handler+0x8>)
100c: 00000000 andeq r0, r0, r0
1010: 00000001 andeq r0, r0, r1
당신은 cortex-m에서 부팅되지 않는 바이너리를 얻습니다. 엄지 손가락으로 .thumb_func를 사용할 수도 있으며 발견 된 다음 레이블은 함수로 간주됩니다.
.thumb_func
reset_handler:
LDR r0, =0
LDR r1, =1
그리고 당신은 다시 훌륭합니다. 바이너리가 작동합니다.
so.elf: file format elf32-littlearm
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4800 ldr r0, [pc, #0] ; (100c <reset_handler+0x4>)
100a: 4901 ldr r1, [pc, #4] ; (1010 <reset_handler+0x8>)
100c: 00000000 andeq r0, r0, r0
1010: 00000001 andeq r0, r0, r1
gnu (s 링커)가 함수간에 트램폴린을 사용하도록하려면 엄지 손가락 연동에도 필요합니다.
.syntax unified
.cpu arm7tdmi
.thumb
.global vector_table
.global reset_handler
.type vector_table, %object
vector_table:
.word 0x20001000
.word reset_handler
.thumb_func
reset_handler:
LDR r0, =0
LDR r1, =1
bl hello
.arm
.type hello, %function
hello:
b reset_handler
준다
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4802 ldr r0, [pc, #8] ; (1014 <hello+0x4>)
100a: 4903 ldr r1, [pc, #12] ; (1018 <hello+0x8>)
100c: f000 f80e bl 102c <__hello_from_thumb>
00001010 <hello>:
1010: ea000002 b 1020 <__reset_handler_from_arm>
1014: 00000000 andeq r0, r0, r0
1018: 00000001 andeq r0, r0, r1
101c: 00000000 andeq r0, r0, r0
00001020 <__reset_handler_from_arm>:
1020: e59fc000 ldr r12, [pc] ; 1028 <__reset_handler_from_arm+0x8>
1024: e12fff1c bx r12
1028: 00001009 andeq r1, r0, r9
0000102c <__hello_from_thumb>:
102c: 4778 bx pc
102e: e7fd b.n 102c <__hello_from_thumb>
1030: eafffff6 b 1010 <hello>
1034: 00000000 andeq r0, r0, r0
그렇지 않으면
.arm
hello:
b reset_handler
작동하지 않는 코드 제공
Disassembly of section .text:
00001000 <vector_table>:
1000: 20001000 andcs r1, r0, r0
1004: 00001009 andeq r1, r0, r9
00001008 <reset_handler>:
1008: 4802 ldr r0, [pc, #8] ; (1014 <hello+0x4>)
100a: 4903 ldr r1, [pc, #12] ; (1018 <hello+0x8>)
100c: f000 f800 bl 1010 <hello>
00001010 <hello>:
1010: ea000002 b 1020 <__reset_handler_from_arm>
1014: 00000000 andeq r0, r0, r0
1018: 00000001 andeq r0, r0, r1
101c: 00000000 andeq r0, r0, r0
00001020 <__reset_handler_from_arm>:
1020: e59fc000 ldr r12, [pc] ; 1028 <__reset_handler_from_arm+0x8>
1024: e12fff1c bx r12
1028: 00001009 andeq r1, r0, r9
102c: 00000000 andeq r0, r0, r0
이제 cortex-m에는 arm 모드가 없으므로 인터 워킹이 없지만 C 또는 기타 상위 수준에서 호출하려는 어셈블리 언어의 벡터 테이블 및 기타 함수의 경우 함수 선언이 필요합니다.
내가 본 적이없는 객체 선언은 팔이 추가 될 무렵부터 gnu 도구를 사용해 왔으며 필요하지 않은 칩 작업을 베어 메탈 부트를 수행하고 있습니다 ... 그래서 거기에서 당신을 도울 수 없습니다.
그들이 일정하게 유지되는 이유는 당신이 칩을 매 달았거나 당신이 정의하지 않은 핸들러에 강제로 넣었 기 때문입니다. 현재의 오류 모드를 나타 내기 위해 프로세서 상태가 변경되어야합니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다