ARM 어셈블러 코드에서 LONG_MIN 및 LONG_MAX와 같은 외부 정의를 사용하려면 어떻게해야합니까?ARM 어셈블러에서 C 정의를 사용하는 방법
의이 my_arm.h가 다음과 같다고 가정 해 보겠습니다
int my_arm(int foo);
의 다음과 같이 나는 my_main.c 있다고 가정 해 봅시다 :
.text
.align 2
.global my_arm
.type my_arm, %function
my_arm:
...
ADDS r1, r1, r2
BVS overflow
...
overflow:
LDR r0, LONG_MAX @ this is probably wrong, how to do it correctly?
BX lr @ return with max value
:
...
#include <limits.h>
#include "my_arm.h"
...
int main (int argc, char *argv[])
{
int foo=0;
...
printf("My arm assembler function returns (%d)\n", my_arm(foo));
...
}
그리고 my_arm.s은 다음과 같습니다
두 번째 줄부터 마지막 줄까지 정확하게로드하는 방법을 모르겠지만 어딘가에서 읽는 것을 막연하게 기억하고 있습니다. LONG_MAX는 .global이지만 더 이상 작동하는 예제에 대한 링크를 찾을 수 없습니다.
나는 팔 - 리눅스 - gnueabi-GCC 버전 4.3.2
==================
UPDATE로 컴파일 오전 : 제안을 감사합니다 ! 불행히도 구문에 문제가 있습니다.
...
.include "mylimits.h"
...
ldr r7, =MY_LONG_MIN @ when it was working it was ldr r7, =0x80000000
...
두 가지 문제 :
첫째, 나는 다음과 같은 my_arm.S에서
#define MY_LONG_MIN 0x80000000
내가 추가 (.S와 같은 디렉토리에 지금은) 약간의 헤더 파일 mylimits.h했다 이 접근법. .include 날 <limits.h>
, 나는 mylimits에 그를 추가해야합니다 포함하지 않는 구문 :
우선 가장 큰 문제 : 심볼 MY_LONG_MIN가 인식되지는 ... 그래서 뭔가는 여전히
둘째 옳지 않다. h, 조금 kludgy 보인다,하지만 그건 괜찮아요 :)
모든 포인터?
시스템 소프트웨어 설계 및 최적화 [2004] 및 ARM 아키텍처 참조 설명서 [2000]에 액세스 할 수 있지만 대상은 XScale-IXP42x 제품군 2 (v5l)입니다.
카일 ARM을 위해 작동하지만 경우 MIPS에서 .S의 확장자로 이름을 변경하여 C의 전처리 파일을 만듭니다. – Tom
#include는 .include가 아니며 .S는 .s가 아니며 대답과 같습니다. 이 방법을 사용하면 gcc 기능을 악용 할 수 있습니다. 물론 x86에서의 테스트와 마찬가지로 어셈블리는 따로 떨어져야합니다. – ShinTakezou