首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将我的C++程序转换为ARM程序集

将我的C++程序转换为ARM程序集
EN

Stack Overflow用户
提问于 2022-03-27 23:49:31
回答 2查看 937关注 0票数 1

我已被指派将此程序转换为arm汇编v8。

代码语言:javascript
运行
复制
int power(int x, int y){
    if (x == 0){
        return 0;
    }
    else if (y < 0){
        return 0;
    }
    else if (y == 0){
        return 1;
        
    }
    else {
        return x * power(x, y - 1);
    }
}

虽然我不太熟悉ARM汇编语言,并想知道从哪里开始。

我曾尝试过对此进行一些研究,但最终在互联网上很少发现有关ARM的信息。

EN

Stack Overflow用户

发布于 2022-03-28 00:19:24

在这样一个简单的例子中,编译器资源管理器就是朋友。

ARMv8 8-具有编译器选项-O1的Clang程序集,用于保持递归:

代码语言:javascript
运行
复制
# Compilation provided by Compiler Explorer at https://godbolt.org/
power(int, int):                             // @power(int, int)
        stp     x29, x30, [sp, #-32]!           // 16-byte Folded Spill
        str     x19, [sp, #16]                  // 8-byte Folded Spill
        mov     x29, sp
        mov     w19, w0
        mov     w0, wzr
        cbz     w19, .LBB0_5
        tbnz    w1, #31, .LBB0_5
        cbz     w1, .LBB0_4
        sub     w1, w1, #1
        mov     w0, w19
        bl      power(int, int)
        mul     w0, w0, w19
        b       .LBB0_5
.LBB0_4:
        mov     w0, #1
.LBB0_5:
        ldr     x19, [sp, #16]                  // 8-byte Folded Reload
        ldp     x29, x30, [sp], #32             // 16-byte Folded Reload
        ret

ARM GCC (linux)程序集具有编译器选项-O1,用于保持递归:

代码语言:javascript
运行
复制
# Compilation provided by Compiler Explorer at https://godbolt.org/
power(int, int):
        push    {r4, lr}
        mov     r4, r0
        clz     r0, r0
        lsrs    r0, r0, #5
        orrs    r3, r0, r1, lsr #31
        it      ne
        movne   r0, #0
        beq     .L6
.L1:
        pop     {r4, pc}
.L6:
        movs    r0, #1
        cmp     r1, #0
        beq     .L1
        subs    r1, r1, #1
        mov     r0, r4
        bl      power(int, int)
        mul     r0, r4, r0
        b       .L1

ARM GCC (无)装配与编译器选项-O1保持递归:

代码语言:javascript
运行
复制
# Compilation provided by Compiler Explorer at https://godbolt.org/
power(int, int):
        push    {r4, lr}
        mov     r4, r0
        rsbs    r0, r0, #1
        movcc   r0, #0
        orrs    r3, r0, r1, lsr #31
        movne   r0, #0
        beq     .L6
.L1:
        pop     {r4, lr}
        bx      lr
.L6:
        cmp     r1, #0
        moveq   r0, #1
        beq     .L1
        sub     r1, r1, #1
        mov     r0, r4
        bl      power(int, int)
        mul     r0, r4, r0
        b       .L1

ARM64 GCC程序集具有编译器选项-O1,用于保持递归:

代码语言:javascript
运行
复制
# Compilation provided by Compiler Explorer at https://godbolt.org/
power(int, int):
        cmp     w1, 0
        ccmp    w0, 0, 4, ge
        bne     .L9
        mov     w0, 0
        ret
.L9:
        stp     x29, x30, [sp, -32]!
        mov     x29, sp
        str     x19, [sp, 16]
        mov     w19, w0
        mov     w0, 1
        cbnz    w1, .L10
.L1:
        ldr     x19, [sp, 16]
        ldp     x29, x30, [sp], 32
        ret
.L10:
        sub     w1, w1, #1
        mov     w0, w19
        bl      power(int, int)
        mul     w0, w19, w0
        b       .L1
票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71641153

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档