Для а) вы хотите что-то в этом роде.Для обеих частей , если , 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