Как писать языки ассемблера ARM для следующих кодов C ++ - PullRequest
0 голосов
/ 03 февраля 2019

Я должен преобразовать следующие языки C в языки ассемблера.Может кто-нибудь мне помочь ?а)

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

Мой ответ на а)

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

вопрос б), я понятия не имею, как это сделать

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

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я настоятельно рекомендую для этого компилятор godbolt (https://godbolt.org/z/AoYRcm)

. Этот инструмент покажет вам код сборки, с которым компилируется ваш язык более высокого уровня. Напишите пример кода на языке c / c ++.компилируется в. Исследуйте каждую инструкцию, используемую в сборке. Тогда вы сможете писать новые программы исключительно в сборке, используя то, что вы изучили.

Да, сборка может быть немного сложнее из современного компилятора

нет, вы не должны дословно копировать вывод проводника компилятора

Код, который оптимизирован, не будет переведен в инструкции по сборке.

0 голосов
/ 03 февраля 2019

Для а) вы хотите что-то в этом роде.Для обеих частей , если , 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),мы предположим, что ИЛИ ведет себя так же, как и в большинстве языков программирования, то есть вторая часть условия оценивается только в том случае, если первая часть выдает 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:

Кстати: при написании ассемблерного кода у вас часто создается впечатление, что вы пишете суперэффективный код, потому что вы заботитесь о каждой детали на самом низком уровне.Тем не менее, компилятор справляется с этим лучше (если очень опытный человек не тратит много времени на оптимизацию кода).

Оптимизирующий компилятор создаст приведенный ниже код для a) и b) (при условии, что данные ужев реестре и будут возвращены через реестр).В обоих случаях он уходит без использования веток.Попробуйте побить это!

а)

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

б)

    sub     r1, r1, #1
    cmp     r1, #24
    movcs   r0, #1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...