【问题标题】:Writing a pseudo-MIPS assembler and fwrite for binary encoding编写伪 MIPS 汇编器和 fwrite 进行二进制编码
【发布时间】:2011-12-31 03:45:47
【问题描述】:

我正在编写一个高级 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 位二进制指令,并将它们写入一个文件以供人造 CPU 读取。

我有一个问题,文件开头的 32 位分隔符应该是 0xf0f0f0f0。我知道您无法“读取”二进制文件,但是查看我拥有的示例文件,分隔符在由 fwrite 写入后由 /360/360/360/360 表示。为什么会这样以及在我编写自己的文件时如何复制该行为(如如何使用 fwrite 来实现这一点以创建其他二进制文件)?

【问题讨论】:

    标签: assembly mips


    【解决方案1】:

    分隔符的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) 程序(在 Ubuntu 上的 hexer 包中)很像交互式 xxd(1),有一天你可能会发现它很有用。)

    【讨论】:

    • 这很有用,但 fwrite 将指向数组的指针作为第一个参数,而不是 int 值
    • @flapjackery: 然后用 &delim 代替 delim
    猜你喜欢
    • 1970-01-01
    • 2017-05-18
    • 2015-05-29
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 2018-07-21
    • 2014-08-08
    • 1970-01-01
    相关资源
    最近更新 更多