директива помещает значение слова -2 и -6 в поток кода. если вы посмотрите на фактически двоичное представление этого фрагмента, то в середине кодировки инструкции вы обнаружите несколько FFFFFFFEFFFFFFFA или FEFFFFFFFAFFFFFF в зависимости от порядка байтов.
Ассемблер будет выдавать данные на 2 слова со значениями -2 и -6 соответственно, ничего похожего на одно слово -8.
Если вы посмотрите на этикетку AVG :, вы заметите, что она использует
lw $v0, ($ra)
lw $t3, 4($ra)
Это загружает 2 слова в регистры v0 и t3 с адреса возврата (т. Е. Откуда вы перешли, то есть с данных, встроенных в сегмент кода). Итак ... v0 получает -2, а t3 получает -6. Также обратите внимание, как сегменты кода добавляют 8 к $ ra перед возвратом, чтобы перепрыгнуть через встроенные данные.
Короче говоря, это способ кодирования значений констант, загружаемых в регистры как часть кодового потока.
Теперь, что делает код, так это складывает 2 вместе, сдвиг вправо, прежде чем вернуться (я предполагаю реализацию Average). В этом конкретном случае не имеет особого смысла выполнять такую большую работу, когда вы можете просто непосредственно вычислить среднее значение во время компиляции (или, если вы напишите asm прямо в своей голове). Я предполагаю, что AVG должен вызываться из многих мест, но даже тогда, так как он ожидает свои значения от сегмента кода (обычно только для чтения), я не вижу смысла вычислять математику на постоянных значениях.