MIPS汇编 - 字符串(ASCII)指令

时间:2011-10-22 01:57:30

标签: c string assembly ascii mips

我正在用C语言编写一个用于MIPS汇编的汇编程序(因此它将MIPS汇编转换为机器代码)。

现在MIPS有三种不同的指令:R-Type,I-Type和J-Type。但是,在.data中。部分,我们可能会有类似message: .asciiz "hello world"的内容。在这种情况下,我们如何将ASCII字符串转换为MIPS的机器代码?

由于

3 个答案:

答案 0 :(得分:5)

ASCII文本未转换为机器代码。它通过Wikipedia上的格式存储。

ASCII Code Chart

MIPS使用此格式存储ASCII字符串。至于.asciiz,特别是字符串加上NUL字符。因此,根据表格,A是十六进制的41,二进制只是0100 0001。但是不要忘记NUL角色,所以:0100 0001 0000

当存储字符串时,我会考虑Mars MIPS simulator的想法,然后在内存中的已知地址处启动内存部分,并将对标签message的任何引用设置为内存中的该位置

请注意,数据部分中的所有内容既不是R型,也不是I型,也不是J型。它只是原始数据。

答案 1 :(得分:3)

数据不可执行,不应转换为机器代码。它应该以适当的目标数据类型的二进制表示形式编码。

答案 2 :(得分:3)

正如其他答案所指出的那样,.ascii "string"指令中包含的ascii以其原始二进制格式编码在目标文件的数据段中。至于从那里发生的情况,这取决于汇编器编码成的二进制格式。 通常数据未编码为机器代码,但是 GNU as会很高兴地将其组装:

.text
start:
  .ascii "Hello, world"
  addi $t1, $zero, 0x1
end:

如果您在objdump中分解输出(我在这里使用mips-img-elf工具链),则会看到以下内容:

Disassembly of section .text:

00000000 <message>:
   0:   48656c6c    0x48656c6c
   4:   6f2c2077    0x6f2c2077
   8:   6f726c64    0x6f726c64
   c:   20090001    addi    t1,zero,1

十六进制序列48 65 6c 6c 6f 2c 20 77 6f 72 6c 64拼写为“ Hello,world”。 我来到这里的时候是在寻找关于GAS为何如此行为的答案。火星不会汇编上面的程序,出现一个错误,即数据指令不能在文本段中使用 有人在这里有见识吗?