混 合 使 用 C、 C++ 和 汇 编 语 言 } disable_IRQ(); enable_IRQ(); 标 量 积 示 例 5-3 计 算 两 个 整 型 数 组 的 标 量 积 。 它 说 明 对 于 内 联 汇 编 程 序 不 直 接 支 持 的 C 或 C++ 表 达 式 和 数 据 类 型 , 内 联 汇 编 语 言 如 何 与 其 交 互 。 内 联 函 数 mlal() 被 优 化 为 单 个 SMLAL 指 令 。 使 用 -S -fs 编 译 程 序 选 项 可 以 查 看 编 译 程 序 生 成 的 汇 编 语 言 代 码 。 long long 与 __int64 相 同 。 在 Examples_directory\inline\dotprod.c 中 也 有 此 代 码 。 示 例 5-3 标 量 积 #include /* change word order if big-endian */ #define lo64(a) (((unsigned*) &a)[0]) /* low 32 bits of a long long */ #define hi64(a) (((int*) &a)[1]) /* high 32 bits of a long long */ __inline __int64 mlal(__int64 sum, int a, int b) { #if !defined(__thumb) && defined(__TARGET_FEATURE_MULTIPLY) __asm { SMLAL lo64(sum), hi64(sum), a, b } #else sum += (__int64) a * (__int64) b; #endif return sum; } __int64 dotprod(int *a, int *b, unsigned n) { __int64 sum = 0; do sum = mlal(sum, *a++, *b++); while (--n != 0); return sum; } int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; int b[10] = { 10, 9, 8, 7, 6, 5, 4, 3, 2, 1 }; 5-10 © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 <strong>ARM</strong> DUI 0203BSC
混 合 使 用 C、C++ 和 汇 编 语 言 int main(void) { printf("Dotproduct %lld (should be %d)\n", dotprod(a, b, 10), 220); return 0; } <strong>ARM</strong> DUI 0203BSC © 2002、 2003 <strong>ARM</strong> Limited 版 权 所 有 。 保 留 所 有 权 利 。 5-11