worm, да тут ка бы оба фактора играют свою роль, в случае когда надо выдержать тайминги асма просто не заменима, ну и с "манёврами" есть порой заморочки, взять к примеру тот же HDD загрузчик для дримкаста, он напополам написан на асме, и все те финты что творятся в ассемблерной части просто не реально воссоздать на языке более высокого уровня
ну к примеру есть две практически идентичных функции, разница между ними минимальна, я просто беру и размещаю всю разницу несколькими асмовыми командами и делаю прыжок на вторую, в случае с сями мой код разросся бы по самое мама не горюй, и влезть в отведённые 16 килобайт было бы проблематично
вот пример двух функций, как видишь вместо того чтоб дважды писать одно и то же, я добавил две команды и использую gd_pioread_stream2 для функции gd_pioread_stream
.align 2
_gd_pioread_stream:
mov #0, r0
mov.l r0, @(8, r4)
_gd_pioread_stream2:
mov #0, r1
mov #4, r6
mov #80, r0
mov.l r1, @(r0, r5)
add #4, r0
mov.l r1, @(r0, r5)
mov.l r6, @(4, r5)
mov.l @(4, r4), r0
shll8 r0
shll2 r0
shll r0
mov.l r0, @(56, r5)
mov.l .gd_execute_cmd_pio_adress, r0
jmp @r0
mov r5, r4
.align 2
.gd_execute_cmd_pio_adress:
.long _pio_stream_internal