Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Замечание: одна и та же команда не может использоваться и для копирования, и для работы со стеком, потому что в случае стека команда push должна делать не инкремент, а декремент, и писать регистры в обратном порядке.
del
ещё лучше, вы можете всё восстановить и вернуться за один раз!
pop {fp, pc}
Надо понимать, что за один раз — это как минимум 3 цикла тут + сброс конвейера.
А что по времени выполнения таких инструкций?
пришлось пойти на компромисс и удвоить количество регистров до 32-х.
Таким образом, вместо ARM64 появились LDP и STP
LDRD r3,r4,[r1,#0]
STRD r3,r4,[r0,#0]
LDRD r3,r4,[r1,#8]
STRD r3,r4,[r0,#8]
LDRD R0, R1, [R2, #const.]!
LDR R0, [R1], #const
Сразу за ней запрещено использовать команду перехода (в любом варианте), а так-же любой другой команды с любым из используемых регистров.
Всё дело в том что R2 должен сначала измениться.
Тут требуется две команды до использования регистров или перехода.
Словом, программировать на асме для арм — можно только в самых исключительных случаях — когда уже нет иного выхода.
И что по-вашему будет?
Регистр R0 не успеет обновиться из внешней памяти.
Это не сложно проверить.
.text
.global _start
.arch armv7a
_start:
ldr r3,=result
ldr r2,=testdata
mov r0,#0x30
mov r1,#0x30
ldrd r0,r1,[r2,#8]! //34
strb r0, [r3,#0]
strb r1, [r3,#1]
mov r0,#0x30
ldr r0,[r2],#4 //3
b 1f
1: strb r0,[r3,#2]
// show results
mov r0,#0
ldr r1,=text
ldr r2,=textlen
mov r7,#4
swi #0
mov r0,#0
mov r7,#1
swi #0
.data
text: .ascii "result is "
result: .ascii "XXX\n"
textlen = . - text
testdata: .word 0x31,0x32,0x33,0x34
Регистр R0 не успеет обновиться из внешней памяти.
Это не сложно проверить.
LDM. Моя любимая инструкция ARM