Assembly lb指令的奇怪输出

Assembly lb指令的奇怪输出,assembly,mips,Assembly,Mips,我对MIPS汇编语言一无所知。我试图得到Label.word3222的第一个数字,也就是3。但产量是150。我只是好奇这150是从哪里来的,我怎样才能得到我想要的值(也得到第二位和第三位)word是32位的值。MIPS可以设置为大端或小端 如果您将了解使用二进制表示法将整数值编码为位的最常见方式,您将看到单字节(8位)可以包含0到255的值 因此,32位=4字节可以包含2564个值:0-4294967295 因此,二进制中的3222是0000 1100 1001 0110(16位仅用于避免我再为

我对MIPS汇编语言一无所知。我试图得到Label.word3222的第一个数字,也就是3。但产量是150。我只是好奇这150是从哪里来的,我怎样才能得到我想要的值(也得到第二位和第三位)

word
是32位的值。MIPS可以设置为大端或小端

如果您将了解使用二进制表示法将整数值编码为位的最常见方式,您将看到单字节(8位)可以包含0到255的值

因此,32位=4字节可以包含2564个值:
0
-
4294967295

因此,二进制中的
3222
0000 1100 1001 0110
(16位仅用于避免我再为高16位写入16个零)

您的目标MIPS平台设置为little endian模式,即第一个字节包含8个最低有效位,因此在内存中该数字被编码为位:

.data 
 number:.word 3222
.text 
.globl _start
 _start:
      li $v0,1
      la $t0,number
      lb $a0,($t0)
      syscall
      li $v0,10
      syscall
总值为150*2560+12*2561+0*2562+0*2563=3222

要得到该数字的第一个数字,你要么计算它的log10,知道哪个10次方是第一位,要么从右边开始,首先计算101的div/mod对,剩余的是“一”位,商可以用于另一个除以10得到“十”,然后是“百”,等等。。直到你得到零

总的来说,10进制(十进制)数字对计算机来说非常麻烦,需要大量的实际计算才能算出特定的数字(除非您将它们存储为字符串或二进制编码(例如BCD)以外的其他形式)->那么很容易得到特定的数字,但是你不能在它们上面使用简单的算术指令,比如
add
,因为它们理解二进制表示法)

还要注意4位的组是如何形成从0到15的值的,它与十六进制数字0-F正好1:1匹配,因此从值的十六进制表示中,您可以轻松读取特定字节的值(两位=一个字节)
3222=0x00000C96=四个字节0x00、0x00、0x0C和0x96
(以小尾端顺序存储在内存中,即从
0x96
开始反向)

有关dec十六进制二进制八进制转换的详细信息,以及其工作原理,请参阅维基百科或一些教程

一个简短的建议是:
3222
不是数字
3222
,它是数字
3222
在十进制格式中的表示,这是人类常用的格式。但是值本身没有任何格式,它是纯粹抽象的东西。通过将其写为
3222
,或将其说成声音,或使用其他(六进制/二进制)编码,您产生的只是真实数学值的“图像”,实际上由于您所需表示的任何缺陷而破坏了它的属性。例如,在十进制格式中,每个整数都有两种表示方式,一种是普通的short
3222
,另一种是无限系列的九个分数
3221.9999…
(是相同的数字)


各种计算机编码的值(特别是浮点值)都有其自身的局限性和怪癖,因此您应该学习计算机如何编码值,以了解您在计算中使用的内容。所以以后你不会惊讶于一个事实,在C++中,在x8664中,例如:<代码>(1E40+1=1E40)< /C>是真的。< /P> < P> <代码> Word < /Cord>是32位值。MIPS可以设置为大端或小端

如果您将了解使用二进制表示法将整数值编码为位的最常见方式,您将看到单字节(8位)可以包含0到255的值

因此,32位=4字节可以包含2564个值:
0
-
4294967295

因此,二进制中的
3222
0000 1100 1001 0110
(16位仅用于避免我再为高16位写入16个零)

您的目标MIPS平台设置为little endian模式,即第一个字节包含8个最低有效位,因此在内存中该数字被编码为位:

.data 
 number:.word 3222
.text 
.globl _start
 _start:
      li $v0,1
      la $t0,number
      lb $a0,($t0)
      syscall
      li $v0,10
      syscall
总值为150*2560+12*2561+0*2562+0*2563=3222

要得到该数字的第一个数字,你要么计算它的log10,知道哪个10次方是第一位,要么从右边开始,首先计算101的div/mod对,剩余的是“一”位,商可以用于另一个除以10得到“十”,然后是“百”,等等。。直到你得到零

总的来说,10进制(十进制)数字对计算机来说非常麻烦,需要大量的实际计算才能算出特定的数字(除非您将它们存储为字符串或二进制编码(例如BCD)以外的其他形式)->那么很容易得到特定的数字,但是你不能在它们上面使用简单的算术指令,比如
add
,因为它们理解二进制表示法)

还要注意4位的组是如何形成从0到15的值的,它与十六进制数字0-F正好1:1匹配,因此从值的十六进制表示中,您可以轻松读取特定字节的值(两位=一个字节)
3222=0x00000C96=四个字节0x00、0x00、0x0C和0x96
(以小尾端顺序存储在内存中,即从
0x96
开始反向)

有关dec十六进制二进制八进制转换的详细信息,以及其工作原理,请参阅维基百科或一些教程

一个简短的建议是:
3222
不是数字
3222
,它是数字
3222
在十进制格式中的表示,这是人类常用的格式。但是值本身没有任何格式,它是纯粹抽象的东西。通过把它写下来作为
3222
或者把它说成声音,或者使用其他(六位/二进制)编码,你们产生的只是真正数学值的“图像”,实际上是damag