交互操作示例
以下是交互操作的示例:
-
Example 5.2 演示汇编语言交互操作
-
Example 5.3 演示使用中间代码的汇编语言交互操作
-
Example 5.4 演示 C 和 C++ 语言交互操作
-
Example 5.5 演示使用中间代码的 C、C++ 和汇编语言交互操作。
此外,RealView Development Suite 也附带了一些交互操作示例。 有关详细信息,请参阅
中的 install_directory
/RVDS/Examples/.../interworkreadme.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. 使用中间代码的汇编语言交互操作
此示例演示汇编代码中的源代码交互操作,其功能是将寄存器 R0
至 R2
分别设置为值 1、2 和 3。 寄存器 R0
和 R2
由 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 <stdio.h> 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 <stdio.h> 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 <stdio.h> 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
-
通过对相应调试目标使用兼容调试器来运行映像。