6410 의 어 셈 블 리 와 c 간 매개 변수 전달

3484 단어 led
1. 어 셈 블 리 가 c 에 매개 변 수 를 전달 하고 호출 합 니 다.
1. 4 개 이하 매개 변수 전달:
어 셈 블 리 가 c 에 전달 하 는 매개 변수 개수 가 4 개 보다 작 거나 같 으 면 이 매개 변 수 는 r0 - r3 레지스터 에 저장 할 수 있 습 니 다. 4 가 남 으 면 나머지 매개 변 수 를 스 택 에 저장 해 야 합 니 다.
어 셈 블 리 코드:
#define CONFIG_PERIPORT_BASE 0x70000000
#define CONFIG_PERIPORT_SIZE 0x13
#define WTCON                0x7E004000 

.global _start

_start:

    /*  CPU      */
    ldr r0, =CONFIG_PERIPORT_BASE
    orr r0, r0, #CONFIG_PERIPORT_SIZE
    mcr p15,0,r0,c15,c2,4

    /*     */
    ldr r0, =WTCON
    mov r1, #1
    str r1,[r0]

    /*  GPM0 GPM3       ,  ,  c  */
    mov sp,#(1024*8)
    ldr r0,=0x8000                            // 0x8000   r0,  r0     c        
    bl xxxx

halt:
    b halt
c 함수:
#define GPMDAT (volatile unsigned long *)0x7F008824
#define GPMCON (volatile unsigned long *)0x7F008820

void delay(int count)//  
{
    volatile unsigned long i = count; //    volatile,             
    while(i){
        i--;
    }
}

int xxxx(int n)   //     n         r0
{
    volatile unsigned long *gpmcon = GPMCON;
    volatile unsigned long *gpmdat = GPMDAT;

    *gpmcon = 0x1111;
    
    int i = 0;
    while(1){
        *gpmdat = i;
        i++;
        if(i == 16)
            i = 0;
        delay(n);
    }   
    return 0;
}   

2. 4 개 이상 의 인자 전달:
어 셈 블 리:
#define CONFIG_PERIPORT_BASE 0x70000000
#define CONFIG_PERIPORT_SIZE 0x13
#define WTCON                0x7E004000 

.global _start

_start:

    /*  CPU      */
    ldr r0, =CONFIG_PERIPORT_BASE
    orr r0, r0, #CONFIG_PERIPORT_SIZE
    mcr p15,0,r0,c15,c2,4

    /*     */
    ldr r0, =WTCON
    mov r1, #1
    str r1,[r0]

    /*  GPM0 GPM3       ,  ,  c  */
    mov sp,#(1024*8)
    mov r0,#0
    mov r1,#16
    ldr r2,=0x1000
    ldr r3,=0x1000           //r0,r1,r2,r3    c         
#   ldr r4,=0x1000           //          r4       c  ,         ,  led       
    ldr sp,=(1024*8-4)        //   5        
    ldr r4,=0x4000
    str r4,[sp]
    bl xxxx

halt: 
    b halt

2. c 함수 호출 어 셈 블 리 코드:
어 셈 블 리:
#define CONFIG_PERIPORT_BASE 0x70000000
#define CONFIG_PERIPORT_SIZE 0x13
#define WTCON                0x7E004000 

.global _start
.global delay              //         global,  c           


_start:

    /*  CPU      */
    ldr r0, =CONFIG_PERIPORT_BASE
    orr r0, r0, #CONFIG_PERIPORT_SIZE
    mcr p15,0,r0,c15,c2,4

    /*     */
    ldr r0, =WTCON
    mov r1, #1
    str r1,[r0]

    /*  GPM0 GPM3       ,  ,  c  */
    mov sp,#(1024*8)
    bl xxxx

halt:
    b halt

delay:
    ldr r0,=0x8000
delay_loop:
    sub r0,r0,#1
    cmp r0,#0
    bne delay_loop
    mov pc,lr              //  mov pc,lr   ,  ,   c    delay  

c 함수:
#define GPMDAT (volatile unsigned long *)0x7F008824
#define GPMCON (volatile unsigned long *)0x7F008820

void delay();//  delay  ,      

int xxxx()
{
    volatile unsigned long *gpmcon = GPMCON;
    volatile unsigned long *gpmdat = GPMDAT;
    
    *gpmcon = 0x1111;
    
    int i = 0;
    while(1){
        *gpmdat = i;
        i++;
        if(i == 16 )
            i = 0;
        delay();
    }   
    return 0;
}   

3. 위치 에 대한 조작 은 다음 과 같은 형식 을 사용 해 야 한다.
* gpmcon = 0x 1111; * gpmcon = (* gpmcon & ~ 0xffff) | 0x 1111 로 변경;
위의 나 쁜 점 은 다른 위치 가 영향 을 받 을 수 있다 는 것 이다. 아래 는 우리 가 필요 로 하 는 위치 만 조작 하고 필요 하지 않 은 것 은 영향 을 받 지 않 을 것 이다.

좋은 웹페이지 즐겨찾기