В настоящее время я пишу некоторые вещи в MIPS-ассемблере и у меня есть некоторые проблемы: Я написал эту функцию:Ассемблер - пропуск инструкции
PRINT_FLOAT:
addi $sp, $sp, -4 #stackpointer um ein wort weiterrücken
sw $ra, 0($sp) #rücksprungadresse auf stack speichern
la $a0, strFloat
add $a1, $s0, $zero
jal printf
lw $ra, 0($sp) #rücksprungadresse aus stack holen
addi $sp, $sp, 4 #stackpointer um ein wort zurückrücken
jr $ra
если я запускаю эту программу инструкции добавить $ a1, $ s0, $ ноль пропускается, и я не знаю, почему ...
Еще одна забавная вещь, если я отлаживать эту программу с помощью GDB:
main:
addi $t0, $zero, 3
addi $t0, $zero, 3
addi $t0, $zero, 3
jal READ_FLOAT
jal PRINT_FLOAT
и установить контрольную точку на основной, то точка останова установленный на третьем «addi $ t0, $ zero, 3» Что здесь происходит?
Собираетесь ли вы с оптимизацией? Это имело бы смысл с тремя заявлениями «addi», поскольку все они делают одно и то же, делая два из них лишними. –
- это ваш ассемблер, добавляющий в слот задержки ветвления? что делает ваша демонстрация для этого кода? привыкший к вам, должен был явно сделать это, в последний раз, когда я использовал ассемблер gnu, он просто поменял инструкцию перед веткой, должен был явно сказать это не так. или сказать, что архитектура не имеет слота задержки ветвления. –