首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何编写ARM汇编语言以遵循C++代码

如何编写ARM汇编语言以遵循C++代码
EN

Stack Overflow用户
提问于 2019-02-03 07:41:20
回答 2查看 580关注 0票数 0

我必须将以下C语言转换为汇编语言。有人能帮我吗?a)

代码语言:javascript
复制
if a>b
x=(a+b)-c
else
x=a*(b+c)

( a)我的回答是

代码语言:javascript
复制
ADR R0,a
ADR R1,b
ADR R2,c
ADR R3,x
LDR R0,[R0]
LDR R1,[R1]
LDR R2,[R2]
ADD R4,R0,R1
ADD R5,R1,R2
branch1 {SUBs R6,R4,R2
         STR R6,[R3]}
branch2 {MULs R7,R5,R0
         STR R7,[R3]}
CMP R0,R1
BGT branch1
BGT branch2

问题b),我不知道怎么做

代码语言:javascript
复制
if(x<=0 OR x>=25){a=1}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-02-03 11:38:43

对于a),你想要的东西沿着这条线。对于if的两个部分,r4用于存储中间结果和x值。

代码语言:javascript
复制
    adr r0, a
    adr r1, b
    adr r2, c
    adr r3, x
    ldr r0, [r0]
    ldr r1, [r1]
    ldr r2, [r2]

    cmp r0, r1
    ble .L1

    add r4, r0, r1
    rsb r4, r2, r4
    str r4, [r3]
    b .L2

.L1:
    add r4, r1, r2
    mul r4, r4, r0
    str r4, [r3]

.L2:

对于b),我们将假设OR在大多数编程语言中的行为与大多数编程语言一样,即条件的第二部分只有在第一部分导致false时才会被评估。

代码语言:javascript
复制
    adr r0, a
    adr r1, x

    ldr r1, [r1]

    cmp r1, #0
    ble .L1

    cmp r1, #24
    ble .L2

.L1:
    mov r2, #1
    str r2, [r0]

.L2:

顺便说一句:在编写汇编程序代码时,你通常会有这样的印象,那就是你在编写超级高效的代码,因为你在最底层处理每一个细节。但是,编译器在这方面做得更好(除非一个非常精通的人需要大量时间来优化代码)。

优化编译器将为a)和b创建以下代码(假设数据已经在寄存器中并将通过寄存器返回)。在这两种情况下,它都不用使用分支就可以逃脱。试着打败它!

a)

代码语言:javascript
复制
    mov     r3, r0
    cmp     r0, r1
    addgt   r0, r0, r1
    addle   r1, r1, r2
    subgt   r0, r0, r2
    mulle   r0, r1, r3

b)

代码语言:javascript
复制
    sub     r1, r1, #1
    cmp     r1, #24
    movcs   r0, #1
票数 1
EN

Stack Overflow用户

发布于 2019-02-04 14:26:18

为此,我强烈推荐哥德波特的编译器浏览器(https://godbolt.org/z/AoYRcm)

此工具将显示您的高级语言编译到的程序集代码。编写一些样例c/c++代码。看看它能编译成什么。研究装配中使用的每一条指令。然后,您将能够编写纯粹在汇编中使用您所学到的新程序。

是的,从现代编译器的角度来看,程序集可能有点复杂。

不,不应该逐字复制编译器资源管理器的输出

优化后的代码将不会被转换为程序集指令。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54500875

复制
相关文章

相似问题

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