Директивы .word в сборке MIPS - PullRequest
3 голосов
/ 04 марта 2010
       .data
VALS:  .half 0xbead, 0xface
RES:   .space 4
    .text
    la     $t0,VALS
    lh    $t1,($t0)
    lhu    $t2,2($t0)
    sll    $t2,$t2,16
    or    $t2,$t1,$t2
    jal    AVG
    .word  -2
    .word  -6
    la    $t4,RES
       sw  $v0,($t4)
       li     $v0,10
    syscall
AVG:   lw  $v0,($ra)
    lw    $t3,4($ra)
    add    $v0,$v0,$t3
    sra    $v0,$v0,1
    addi   $ra,$ra,8
    jr     $ra

В этом коде MIPS, что делают части .word? Мой эмулятор не может обрабатывать директивы данных в текстовом разделе. Что делают директивы? И какой смысл делать .word -2 и .word -6, а не .word -8?

1 Ответ

4 голосов
/ 04 марта 2010

директива помещает значение слова -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 должен вызываться из многих мест, но даже тогда, так как он ожидает свои значения от сегмента кода (обычно только для чтения), я не вижу смысла вычислять математику на постоянных значениях.

...