我正在用C语言编写一个用于MIPS汇编的汇编程序(因此它将MIPS汇编转换为机器代码)。
现在MIPS有三种不同的指令:R-Type,I-Type和J-Type。但是,在.data
中。部分,我们可能会有类似message: .asciiz "hello world"
的内容。在这种情况下,我们如何将ASCII字符串转换为MIPS的机器代码?
由于
答案 0 :(得分:5)
ASCII文本未转换为机器代码。它通过Wikipedia上的格式存储。
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为何如此行为的答案。火星不会汇编上面的程序,出现一个错误,即数据指令不能在文本段中使用
有人在这里有见识吗?