交互操作示例

发布于:2021-09-22 19:07:33

交互操作示例


以下是交互操作的示例:



    Example?5.2 演示汇编语言交互操作

    Example?5.3 演示使用中间代码的汇编语言交互操作

    Example?5.4 演示 C 和 C++ 语言交互操作

    Example?5.5 演示使用中间代码的 C、C++ 和汇编语言交互操作。



    此外,RealView Development Suite 也附带了一些交互操作示例。 有关详细信息,请参阅 install_directory/RVDS/Examples/.../interwork 中的 readme.txt 文件。




    Example?5.2.?汇编语言交互操作



    此示例实现一小段后跟 ADR 指令的头文件节 (SECTION 1),以获取标签 THUMBProg 的地址,并设置该地址的最低有效位。 BX 指令将状态更改为 Thumb 状态。


    SECTION2 中,Thumb 代码将两个寄存器的内容相加,使用 ADR 指令获取标签 ARMProg 的地址,并清除最低有效位。 BX 指令将状态改回 ARM 状态。


    SECTION3 中,ARM 代码将两个寄存器中的值相加,然后结束。


    ????; ********
    ; addreg.s
    ; ********

    ?????PRESERVE8
    AREA AddReg,CODE,READONLY ; Name this block of code.
    ENTRY ; Mark first instruction to call.
    ; SECTION1
    start
    ADR R0, ThumbProg:OR:1???????? ; Generate branch target address
    ; and set bit 0, hence arrive
    ; at target in Thumb state.
    BX R0 ; Branch exchange to ThumbProg.
    ; SECTION2
    THUMB ; Subsequent instructions are Thumb code.
    ThumbProg
    MOVS R2, #2 ; Load R2 with value 2.
    MOVS R3, #3 ; Load R3 with value 3.
    ADDS R2, R2, R3 ; R2 = R2 + R3
    ADR R0, ARMProg
    BX R0 ; Branch exchange to ARMProg.
    ; SECTION3
    ARM ; Subsequent instructions are ARM code.
    ARMProg
    MOV R4, #4
    MOV R5, #5
    ADD R4, R4, R5
    ; SECTION 4
    stop MOV R0, #0x18 ; angel_SWIreason_ReportException
    LDR R1, =0x20026 ; ADP_Stopped_ApplicationExit
    SVC 0x123456 ; ARM semihosting
    END ; Mark end of this file.

    按照以下步骤编译并链接模块:



      若要汇编源文件以进行交互操作,请键入:

      armasm --debug --apcs=/interwork addreg.s

      若要链接对象文件,请键入:

      armlink addreg.o -o addreg.axf

      或者,若要查看交互操作中间代码的大小,请键入:

      armlink addreg.o -o addreg.axf --info=veneers

      通过对相应调试目标使用兼容调试器来运行映像。









    Example?5.3.?使用中间代码的汇编语言交互操作



    此示例演示汇编代码中的源代码交互操作,其功能是将寄存器 R0R2 分别设置为值 1、2 和 3。 寄存器 R0R2 由 ARM 代码设置。R1 由 Thumb 代码设置。 链接器会自动添加交互操作中间代码。 使用中间代码:



      必须用 --apcs=/interwork 选项来汇编代码

      使用 BX lr 指令返回,而不是 MOV pc,lr



      ; *****
      ; arm.s
      ; *****

      PRESERVE8
      AREA Arm,CODE,READONLY ; Name this block of code.
      IMPORT ??ThumbProg
      ENTRY ; Mark 1st instruction to call.
      ARMProg
      MOV R0,#1 ; Set R0 to show in ARM code.
      BL ThumbProg ; Call Thumb subroutine.
      MOV R2,#3 ???????????????????; Set R2 to show returned to ARM.
      ; Terminate execution.
      MOV R0, #0x18 ; angel_SWIreason_ReportException
      LDR R1, =0x20026 ; ADP_Stopped_ApplicationExit
      SVC 0x123456 ; ARM semihosting (formerly SWI)
      END

      ; *******
      ; thumb.s
      ; *******

      AREA Thumb,CODE,READONLY ; Name this block of code.
      THUMB ; Subsequent instructions are Thumb.
      EXPORT ThumbProg
      ThumbProg
      MOVS R1, #2 ; Set R1 to show reached Thumb code.
      BX lr ; Return to the ARM function.
      END ; Mark end of this file.

      按照以下步骤编译并链接模块:



        若要汇编用于交互操作的 ARM 代码,请键入:

        armasm --debug --apcs=/interwork arm.s

        若要汇编用于交互操作的 Thumb 代码,请键入:

        armasm --thumb --debug --apcs=/interwork thumb.s

        若要链接对象文件,请键入:

        armlink arm.o thumb.o -o count.axf

        或者,若要查看交互操作中间代码的大小,请键入:

        armlink arm.o thumb.o -o count.axf --info=veneers

        通过对相应调试目标使用兼容调试器来运行映像。









      Example?5.4.?C 和 C++ 语言交互操作



      此示例演示一个 Thumb 例程,它执行对 ARM 子例程的交互操作调用。 该 ARM 子例程对 Thumb 库中的 printf() 进行交互操作调用。


      /*********************
      * thumbmain.c *
      **********************/

      #include

      extern void arm_function(void);

      int main(void)
      {
      printf("Hello from Thumb/n");
      arm_function();
      printf("And goodbye from Thumb/n");
      return (0);
      }

      ?????/*********************
      * armsub.c *
      **********************/
      #include

      void arm_function(void)
      {
      printf("Hello and Goodbye from ARM/n");
      }

      按照以下步骤编译并链接模块:



        若要编译用于交互操作的 Thumb 代码,请输入:

        armcc --thumb -c --debug --apcs=/interwork thumbmain.c -o thumbmain.o

        若要编译用于交互操作的 ARM 代码,请输入:

        armcc -c --debug --apcs=/interwork armsub.c -o armsub.o

        若要链接对象文件,请键入:

        armlink thumbmain.o armsub.o -o thumbtoarm.axf

        或者,若要查看交互操作中间代码的大小,请键入:

        armlink armsub.o thumbmain.o -o thumbtoarm.axf --info=veneers

        通过对相应调试目标使用兼容调试器来运行映像。









      Example?5.5.?使用中间代码的 C、C++ 和汇编语言交互操作



      此示例演示 C 语言 Thumb 代码与汇编语言 ARM 代码之间的交互操作。


      /**********************
      * thumb.c *
      **********************/

      #include
      extern int arm_function(int);
      int main(void)
      {
      int i = 1;
      printf("i = %d/n", i);
      printf("And i+4 = %d/n", arm_function(i));
      return (0);
      }

      ; *****
      ; arm.s
      ; *****

      PRESERVE8
      AREA Arm,CODE,READONLY ; Name this block of code.
      EXPORT arm_function
      arm_function
      ADD R0,R0,#4 ; Add 4 to first parameter.
      BX lr ; Return
      END

      按照以下步骤编译并链接模块:



        若要编译用于交互操作的 Thumb 代码,请输入:

        armcc --thumb --debug -c --apcs=/interwork thumb.c

        若要汇编用于交互操作的 ARM 代码,请键入:

        armasm --debug --apcs=/interwork arm.s

        若要链接对象文件,请键入:

        armlink arm.o thumb.o -o add.axf

        或者,若要查看交互操作中间代码的大小,请键入:

        armlink arm.o thumb.o -o add.axf --info=veneers

        通过对相应调试目标使用兼容调试器来运行映像。

相关推荐

最新更新

猜你喜欢