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

MIPS汇编-字符串(ASCII)指令,c,string,assembly,ascii,mips,C,String,Assembly,Ascii,Mips,我正在用C为MIPS汇编编写汇编程序(因此它将MIPS汇编转换为机器代码) 现在MIPS有三种不同的指令:R-Type、I-Type和J-Type。但是,在.data中。节中,我们可能会看到类似于的消息:.asciiz“hello world”。在这种情况下,我们如何将ASCII字符串转换为MIPS的机器代码 谢谢数据不可执行,不应转换为机器代码。它应该按照目标数据类型的正确二进制表示形式进行编码。ASCII文本不会转换为机器代码。它通过上的格式存储 MIPS使用此格式存储ASCII字符串。特

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

现在MIPS有三种不同的指令:R-Type、I-Type和J-Type。但是,在
.data
中。节中,我们可能会看到类似于
的消息:.asciiz“hello world”
。在这种情况下,我们如何将ASCII字符串转换为MIPS的机器代码


谢谢

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

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

MIPS使用此格式存储ASCII字符串。特别是对于
.asciiz
,它是字符串加上NUL字符。因此,根据表格,A是十六进制的
41
,而二进制的
01000001
。但是不要忘记NUL字符,所以:
01000010000

在存储字符串时,我会采用的想法,只需在内存中的已知地址启动内存部分,并对设置到内存中该位置的标签
消息
进行任何引用


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

正如其他答案所指出的,包含在
.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
节的反汇编。文本:
00000000 :
0:48656c6c 0x48656c6c
4:6f2c2077 0x6f2c2077
8:6f726c64 0x6f726c64
c:20090001 addi t1,零,1
十六进制序列
48656c6c6f2c20776f726c64
拼写出“你好,世界”。 我来这里是为了寻找一个关于气体为什么会这样的答案。Mars不会汇编上述程序,这会导致一个错误,即文本段中不能使用数据指令
这里有人有什么见解吗?

是的,我知道。我的
.data
只能有
.word
.asciiz
。如果它是
.word
,那么我只需将数字转换为其32位表示形式。但是如何将
.asciiz
表示为机器代码指令呢?我需要把它转换成机器代码。因此,
array:.word 0:10
将创建以下10条指令:
000000000000000001010
。asciiz不是一条机器代码指令,它是一条汇编指令。它告诉汇编程序它应该以某种格式将这些数据存储在最终的二进制文件中。换句话说,汇编程序负责将数据的表示转换为正确的二进制格式,并以这种方式将其存储在可执行文件中。您不会将.asciiz表示为机器代码指令。假设您正在实现一个相当标准的ABI,您会将其存储为一个字节序列,每个字节包含一个字母的ASCII值,后跟一个NUL终止符。啊,对了。我很抱歉使用“机器代码指令”。我指的是“字节序列”。谢谢,了解什么?为什么MARS的汇编程序上有训练轮,而不允许您在asm源要求的地方汇编任意字节?通常,您会将字符串放在
.section.rodata
中,它们将作为文本段的一部分链接到其中,但将它们放在文本段中不会执行的位置完全可以。或者用
字节0x20、0x09、0x00、0x01等手动编码指令。(通常没有理由这么做,但如果你想的话,你可以这么做。)但是如果你不明白你在做什么,很容易把数据放在执行的地方,这可能会让初学者感到困惑,因此火星上的训练轮/nerf填充。不过,我认为它的模拟器/模拟器确实是从MIPS机器代码运行您的程序,所以我不认为MARS是直接“组装”到模拟器内部,并将.text部分限制为它可以从文本解析的asm指令。嗨,Peter,感谢您的回复。我不关心火星在这里的行为,我感兴趣的是为什么GAS允许您使用
.ascii
指令将原始字节编码到
.text
部分。我认为您刚刚回答了这个问题,您可以使用这些指令将任意二进制数据放在任何您喜欢的地方,可能用于手动编码指令。我又看了一遍,是的,
objdump
将尝试将您插入的二进制数据解释为指令。对,
objdump
无法分辨字节是如何到达的。这些都只是汇编程序输出文件中的字节。火星绝对是个例外;大多数汇编器都像GAS一样,很乐意将一行asm源代码组装成字节,不管当前部分是什么。这取决于程序员,以确保这是有用的。谢谢你澄清这一点。这种看待事物的方式非常有意义,并且解释了为什么GAS允许这样做。并且假设输入字符集也是ASCII(或者可能是UTF-8),那么汇编器应该简单地将字节从源文件复制到输出文件(在当前输出位置),一直复制到带引号的字符串的末尾。尽管您确实需要处理C样式的转义序列,如
\n
=
0xa
(LF=linefeed)。