【问题标题】:MIPS Assembly - String to Binary RepresentationMIPS 程序集 - 字符串到二进制表示
【发布时间】:2011-10-22 21:20:18
【问题描述】:

我想将一个字符串转换为它在 C 中的二进制表示以适应 MIPS 汇编(我正在用 C 编写一个 MIPS 汇编器)。

对于字符串“The sum”,MIPS 的处理方式如下(我提取了 MIPS 的 .data 部分):

00100000011001010110100001010100
00100000011011010111010101110011
01101110001000000110011001101111
01100101011000100110110101110101
01101001001000000111001101110010
01110010011000010010000001101110
00100000011110010110000101110010

字母T 是二进制的1010100。我可以在第一行的末尾看到 1010100,但其余的不应该是零(所以它的符号扩展到 32 位,因为 MIPS 处理 32 位)?

h是1101000,第二行连1101000都没有,这是为什么呢?

谁能给我解释一下?

谢谢,

【问题讨论】:

    标签: c string assembly ascii mips


    【解决方案1】:

    ASCII 数据不是“符号扩展的”。使用 MIPS Mars 模拟器,我输入:

    .data 
    .asciiz "The sum"
    
    .text
    main:
    

    这生成了数据段:

    Address:   Value:
    0x10010000 0x20656854
    0x10010004 0x006d7573
    

    但是等等,“总和”的十六进制值不就是54:68:65:20:73:75:6d吗?是的,请注意它们实际存储的顺序。或者更确切地说,查看Endianness。最低值具有最高地址(或者,最高有效字节是第一个地址)。 ASCII 字符串使用 Big Endian 格式存储。

    因此,当您存储字符串时,计算十六进制值,将字符串拆分为单词,然后以相反的顺序存储每个字符。然后转成二进制。

    【讨论】:

    • 空格在哪条指令有关系吗?
    • 在我回答的你的另一个问题中,空格是十六进制的 0x20。
    • 是的,我知道这一点。但是,总和之间的空格会与“the”或“sum”一起使用吗?还是没关系?
    • 字符串被分解为称为words 的内存单元,而不是实际的单词。在这种情况下,一个单词是 4 个字符。所以字符串“the sum”被分解为“the”和“sum\0”。
    • 是的,MIPS 中的word 是 4 个字节。如果我们的单词比单词大怎么办?所以说:“你好”。这将如何分手?
    【解决方案2】:
    $ echo "00100000011001010110100001010100
    00100000011011010111010101110011
    01101110001000000110011001101111
    01100101011000100110110101110101
    01101001001000000111001101110010
    01110010011000010010000001101110
    00100000011110010110000101110010
    "| perl -pe '$_=pack"B*",$_'
     ehT musn foebmui srra n yar
    

    不知何故,该字符串的字符顺序很奇怪。您是否将 4 个字符分组到 int 中?

    【讨论】:

    • 也许 OP 忘记了 mips 通常是大端?
    • 我只是想知道 OP 是如何提取该 .data 部分的,以及为什么他将其提取为二进制而不是 ASCII 或十六进制。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2016-02-26
    相关资源
    最近更新 更多