如何编写用于以下C ++代码的ARM汇编语言

时间:2019-02-03 07:41:21

标签: assembly arm

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

if a>b
x=(a+b)-c
else
x=a*(b+c)

我对a)的回答是

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),我不知道该怎么做

if(x<=0 OR x>=25){a=1}

2 个答案:

答案 0 :(得分:1)

对于a),您需要遵循以下原则。对于 if 的两个部分,都使用 r4 存储中间结果和 x 值。

    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 。

    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:

BTW:在编写汇编代码时,您常常会觉得自己正在编写超高效的代码,因为您会在最低层处理所有细节。但是,编译器的性能更好(除非非常熟练的人花费大量时间来优化代码)。

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

a)

    mov     r3, r0
    cmp     r0, r1
    addgt   r0, r0, r1
    addle   r1, r1, r2
    subgt   r0, r0, r2
    mulle   r0, r1, r3

b)

    sub     r1, r1, #1
    cmp     r1, #24
    movcs   r0, #1

答案 1 :(得分:0)

为此,我强烈推荐Godbolt的编译器资源管理器(https://godbolt.org/z/AoYRcm

此工具将向您显示您的高级语言被编译为的汇编代码。编写一些示例c / c ++代码。看看它编译成什么。研究汇编中使用的每个指令。然后,您将能够使用所学的知识,纯粹用汇编语言编写新程序。

是的,对于现代编译器来说,汇编可能会有些复杂

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

经过优化的代码将不会转换为汇编指令。