关于C#:MIPS汇编-字符串(ASCII)指令

MIPS Assembly - String (ASCII) Instructions

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

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

谢谢


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

ASCII

MIPS使用此格式存储ASCII字符串。特别是对于.asciiz,它是字符串加上NUL字符。因此,根据工作表,A在十六进制中为41,而在二进制中仅为0100 0001。但是请不要忘记NUL字符,因此:0100 0001 0000

在存储字符串时,我会采用Mars MIPS模拟器的想法,只需在内存中的已知地址处启动内存部分,然后对设置为内存中该位置的标签message进行任何引用。

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


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

1
2
3
4
5
.text
start:
  .ascii"Hello, world"
  addi $t1, $zero, 0x1
end:

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

1
2
3
4
5
6
7
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为何如此行为的答案。火星将不会汇编上述程序,并给出一个错误,即数据指令不能在文本段中使用
有人在这里有见识吗?


数据不可执行,因此不应转换为机器代码。应该以目标数据类型的正确二进制表示形式对其进行编码。