ARM 기반 마이크로 컨트롤러에서 SVC 호출을 작성하는 올바른 방법을 알고 싶습니다.자신의 SVC 작성 ARM 어셈블리 호출
나의 이해는 지금까지 ARM은 모든 프로그램의 첫 번째 지침은 적절한 핸들러로 분기해야한다는 것을 의미, 예외 벡터 테이블을 가지고 있다는 것입니다 :
이RESET ;Handles reset
UNDEFINED ;Undefined instructions
SVC BL SVC_Entry
PRE_ABORT ;Prefetch abort
DAT_ABORT ;Data abort
그런 때마다이 SVC 명령어가 실행 된 것입니다 , 모드는 SVC와 함께 제공되는 수는 R0에 저장되고, 관리자로 전환되고 프로그램은 적절한 핸들러로 분기 것이다 :
;== Handling SVC calls ========================================================
Max_SVC EQU 1
SVC_Entry CMP R0, #Max_SVC ;Check upper limit
BHI SVC_end ;Does nothing if unknown
ADD R0, PC, R0, LSL #2 ;Calculate table address
LDR PC, [R0, #0]
Jump_table DEFW SVC_0 ;Halt
DEFW SVC_1 ;Print string
;== SVC calls ================================================================
SVC_1 B SVC_end
SVC_end MOVS PC, LR ;Exiting
그래서 우리는이 지침이있는 경우 :
프로그램은 감독자 모드로 전환하고 숫자 "1"을 R0에 저장 한 다음 점프 테이블 분기를 따라 SVC_1에 코드를 실행하고 사용자 모드로 다시 전환해야합니다.
이 정보가 맞습니까? 내가 제대로하고 있니? 지금까지이
문제는 내 컴파일러는이 라인을위한 "연산자 예상"라는 점이다 :이 주제에
SVC BL SVC_Entry
정보는 인터넷에서 찾을 어렵다 난 그냥 알고 싶어
방법을 제대로 ARM 마이크로 컨트롤러에서 SVC 호출을 사용합니다.대단히 감사합니다.
편집 : 기본 프로세서는 약 240MHz의 ARM9 클록 킹입니다. 이것은 AT91 마이크로 컨트롤러에 있습니다. 연구실 게시판은 내 대학의 필요에 맞게 수정되었습니다.
코드는 직렬 포트를 통해 맞춤식 프로그램을 사용하여 보드에로드됩니다. 이 프로그램은 또한 디버깅을 허용합니다.
어떤 마이크로 컨트롤러 또는 제품군을 타겟팅합니까? arm7tdmi? 피질 -m? –
'SVC : B SVC_Entry'와 같은 것이 필요합니다. ':'콜론은 그것을 레이블로 만든다. 'svc_vec : b SVC_Entry'와 같이 ** svc_vec **로 이름을 짓는 것이 좋습니다. 다른 문제는 ** BL **을 사용하면 * 사용자 * 반환 주소를 삭제합니다. 당신은'R0' 또는 당신이 수립하고자하는 컨벤션을 사용할 수 있습니다; 일반적으로 지침을 검토하는 것이 일반적으로 느립니다. ** 수퍼바이저 ** 스택 및 모드를 설정하는 것을 잊지 마십시오. * 사용자 * 레지스터를 변경하기 전에 저장하는 것이 좋습니다. * 호출 규칙 *에서 정의하지 않는 한. –
@dwelch 전통적으로 SVC 호출 번호는 op 코드로 인코딩되었습니다 (이것이 ROSCOS에서 도토리가 사용했던 방법입니다). 그러나 ARM Linux와 iOS는 모두 레지스터로 전달합니다. Harvard 아키텍처를 사용하는 모든 ARM 장치의 성능 지점에서 4 바이트 만 읽을 가능성이있는 라인으로 D 캐시를 오염시키지 않아도됩니다. , 및 대응하는 캐시 - 라인 필을 포함한다. – marko