Написание псевдо-MIPS-ассемблера и fwrite для двоичного кодирования - PullRequest
1 голос
/ 31 декабря 2011

Я пишу высокоуровневый ассемблер MIPS. У меня проблемы с битой, пытаясь заставить fwrite правильно выводить. Пример файла сборки выглядит следующим образом:

.text
    addi    $t0,$0,7 
    addi    $t1,$0,1 
L1: 
    beq $t0,$0,DONE 
    mult    $t1,$t0 
    mflo    $t1  
    addi    $t0,$t0,-1 
    j   L1 
DONE:   
    add $a0,$0,$t1 
    addi    $v0,$0,1 
    syscall 
    addi    $v0,$0,10 
    syscall 

Мой код должен преобразовать их в 32-битные двоичные инструкции и записать их в файл, который будет прочитан faux-CPU.

У меня возникла проблема, когда 32-разрядный разделитель в начале файла должен быть 0xf0f0f0f0. Я знаю, что вы не можете «прочитать» двоичный файл, но, глядя на файл примера, который у меня есть, разделитель представляется / 360/360/360/360 после записи в fwrite. Почему это так, и как мне повторить такое поведение, когда я пишу свой собственный файл (например, как использовать fwrite для достижения этой цели при создании других двоичных файлов)?

1 Ответ

0 голосов
/ 31 декабря 2011

fwrite(3) для вашего разделителя будет выглядеть так:

unsigned int delim = 0xF0F0F0F0;

fwrite(&delim, sizeof delim, 1, output);

Это записывает один объект размером delim в стандартный поток C output.

Вы можете использовать od(1) или xxd(1) для «чтения» двоичных файлов:

$ od -bc /etc/passwd
0000000 162 157 157 164 072 170 072 060 072 060 072 162 157 157 164 072
          r   o   o   t   :   x   :   0   :   0   :   r   o   o   t   :
$ xxd /etc/passwd
0000000: 726f 6f74 3a78 3a30 3a30 3a72 6f6f 743a  root:x:0:0:root:
0000010: 2f72 6f6f 743a 2f62 696e 2f62 6173 680a  /root:/bin/bash.

(Программа hexer(1) (в пакете hexer в Ubuntu) очень похожа на интерактивную xxd(1), вы можете найти это полезным когда-нибудь.)

...