포스트

diassembly

diassembly

diassembly

1
2
3
4
5
6
7
8
    P10_IOCR0.U &= ~(0x1F<<19);
    P10_IOCR0.U |= (0x10<<19);

    while(1)
    {
        P10_OUT.U = 0x1 << 2;

    }

1. diassembly

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
47            P10_IOCR0.U &= ~(0x1F<<19);
8000006c:   movh.a  a15,0xF004        // a15 = 0xF0040000
80000070:   ld.w  d15,[a15]-0x4FF0    // d15 = *(0xF0040000 - 0x4FF0) → P10_IOCR0 값 읽기
80000074:   insert  d15,d15,0x00,0x13,0x05  // d15의 19번 비트부터 5비트를 0으로 변경
80000078:   movh.a  a15,0xF004        // a15 = 0xF0040000 (재설정)
8000007c:   st.w  [a15]-0x4FF0,d15    // *(0xF0040000 - 0x4FF0) = d15 → P10_IOCR0 값 저장

48            P10_IOCR0.U |= (0x10<<19);
80000080:   movh.a  a15,0xF004        // a15 = 0xF0040000
80000084:   ld.w  d15,[a15]-0x4FF0    // d15 = *(0xF0040000 - 0x4FF0) → P10_IOCR0 값 읽기
80000088:   insert  d15,d15,0x01,0x17,0x01  // d15의 23번 비트부터 1비트를 1로 변경 (0x10 << 19 적용)
8000008c:   movh.a  a15,0xF004        // a15 = 0xF0040000 (재설정)
80000090:   st.w  [a15]-0x4FF0,d15    // *(0xF0040000 - 0x4FF0) = d15 → P10_IOCR0 값 저장

51            while(1)
80000094:   j  "Cpu0_Main.c"::51 (0x800000A0)  // 무한 루프 (Jump to 0x800000A0)

53                P10_OUT.U = 0x1 << 2;
80000096:   mov  d15,0x04             // d15 = 0x04 (0x1 << 2)
80000098:   movh.a  a15,0xF004        // a15 = 0xF0040000
8000009c:   st.w  [a15]-0x5000,d15    // *(0xF0040000 - 0x5000) = d15 → P10_OUT 설정

51            while(1)
800000a0:   j  "Cpu0_Main.c"::53 (0x80000096)  // 무한 루프 (Jump to 0x80000096)

56        }
800000a2:   ret                        // 함수 종료 (return)

a15 : address register
d15 : data register

PORT 10 주소 : Port 10 F003 B000H -F003 B0FFH

모든 PORT(~40) 끝나고 다음 SEGMENT 시작 주소 : F004 0000H

2. Register 직접 접근 vs iLLD

iLLD : Infineon Low Level Driver

1
2
3
4
5
6
    while(1)
    {
        P10_OUT.U = 0x1 << 2;
        IfxPort_setPinHigh(IfxPort_P10_2.port, IfxPort_P10_2.pinIndex);

    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
54            while(1)
80000094:   j  "Cpu0_Main.c"::54 (0x800000BC)
/*------------------Register----------------------*/
56                P10_OUT.U = 0x1 << 2;
80000096:   mov  d15,0x04
80000098:   movh.a  a15,0xF004
8000009c:   st.w  [a15]-0x5000,d15
/*------------------iLLD----------------------*/
57                IfxPort_setPinHigh(IfxPort_P10_2.port, IfxPort_P10_2.pinIndex);
800000a0:   movh.a  a15,0x6000
800000a4:   lea  a15,[a15]0x0004
800000a8:   ld.a  a15,[a15]
800000aa:   movh.a  a2,0x6000
800000ae:   lea  a2,[a2]0x0004
800000b2:   ld.bu  d15,[a2],0x04
568           IfxPort_setPinState(port, pinIndex, IfxPort_State_high);
800000b4:   mov  d0,0x01
592           port->OMR.U = action << pinIndex;
800000b6:   sha  d0,d0,d15
800000ba:   st.w  [a15],0x04,d0
54            while(1)
800000bc:   j  "Cpu0_Main.c"::56 (0x80000096)
1
2
3
4
5
6
7
8
9
10
    while(1)
    {
        P10_OMR.U = 0x60006;

        P10_OUT.U = 0x1 << 2;

        P10_OUT.U = 0x1 << IfxPort_P10_2.pinIndex;
        IfxPort_P10_2.port->OMR.U = 1 << IfxPort_P10_2.pinIndex;
        IfxPort_setPinHigh(IfxPort_P10_2.port, IfxPort_P10_2.pinIndex);
    }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 67               P10_OMR.U = 0x60006;
80000360:   mov  d15,0x06
80000362:   addih  d15,d15,0x0006
80000366:   movh.a  a15,0xF004
8000036a:   st.w  [a15]-0x4FFC,d15
 69               P10_OUT.U = 0x1 << 2;
8000036e:   mov  d15,0x04
80000370:   movh.a  a15,0xF004
80000374:   st.w  [a15]-0x5000,d15
 71               P10_OUT.U = 0x1 << IfxPort_P10_2.pinIndex;
80000378:   mov  d0,0x01
8000037a:   movh.a  a15,0x6000
8000037e:   lea  a15,[a15]0x0004
80000382:   ld.bu  d15,[a15],0x04
80000384:   sha  d0,d0,d15
80000388:   movh.a  a15,0xF004
8000038c:   st.w  [a15]-0x5000,d0
 72               IfxPort_P10_2.port->OMR.U = 1 << IfxPort_P10_2.pinIndex;
80000390:   movh.a  a15,0x6000
80000394:   lea  a15,[a15]0x0004
80000398:   ld.a  a15,[a15]
8000039a:   mov  d0,0x01
8000039c:   movh.a  a2,0x6000
800003a0:   lea  a2,[a2]0x0004
800003a4:   ld.bu  d15,[a2],0x04
800003a6:   sha  d0,d0,d15
800003aa:   st.w  [a15],0x04,d0
 73               IfxPort_setPinHigh(IfxPort_P10_2.port, IfxPort_P10_2.pinIndex);
800003ac:   movh.a  a15,0x6000
800003b0:   lea  a15,[a15]0x0004
800003b4:   ld.a  a15,[a15]
800003b6:   movh.a  a2,0x6000
800003ba:   lea  a2,[a2]0x0004
800003be:   ld.bu  d15,[a2],0x04
568           IfxPort_setPinState(port, pinIndex, IfxPort_State_high);
800003c0:   mov  d0,0x01
592           port->OMR.U = action << pinIndex;
800003c2:   sha  d0,d0,d15
800003c6:   st.w  [a15],0x04,d0

Register 직접 접근과 iLLD의 asm 코드는 같음
보이기에 같은 동작이라도 어떤 Register을 제어하냐에 따라 세부적인 동작이 다르기에 asm 코드가 다름

3. inline assembly

P10_OMR.U = 0x60006;

1
2
3
4
5
6
7
8
9
10
11
12
    while(1)
    {
        __asm__(
                "mov         d0, #0x6  \n\t"
                "addih       d0, d0, #0x6      \n\t"
                "movh.a      a15, #0xf004      \n\t"
                "st.w        [a15] - 0x4ffc, d0 \n\t"
                :
                :
                : "a15", "d0"
            );
    }