sparc程序集加载和存储

时间:2014-05-01 06:06:41

标签: assembly sparc

您好,我一直在网上查看,我的书并没有解释加载指令如何适用于Sparc程序集。

ldsb - load signed byte
ldub - load unsigned byte
ldsh - load signed half word
Lduh - load unsigned half word 
Ld - load word
Ldd - load double 

我也知道一个字节是8位,是2个十六进制数字,一半是16位,字是32位。

所以用下面的解决方案来看这个例子,有人可以解释如何到达那个答案。 第一列是地址(十进制),第二列是数据(十六进制)

300.  78
301.  56
302.  34 
303.  12
304.  9a
305.  00
306.  'H'
307.  'e'
308.  'l'
309.  'l'
310.  'o' 


Ex. ld[%o1], %o0 %o1 = 0x12345678
Ex2. Ldub[%o0+7], %o2 %o2 = 'e'
Ex3. Ldsh[%o0+3], %o3 Error
Ex4. Ldsh[%o0+4], %o4 %o4 = 0x9a
Ex5. Ldsb[%o0+4], %o5 %o5 = ffffff9a

我只需要帮助解释为什么我能理解这个概念。感谢

1 个答案:

答案 0 :(得分:2)

如果你的书真的没有解释,那么你应该寻找其他资源,比如SPARC架构手册。

要得出问题中给出的结果,需要在您的问题中提及一些假设:第一个是o0的值是300,第二个是该数据是在little-endian byte order

中访问的

示例1:应该是显而易见的(除了它包含一个拼写错误;它很可能读取ld [%o0], %o1):四个字节0​​x78,0x56,0x34,0x12被加载到o1。在小端布局中,最低有效字节位于最低地址,最高有效字节位于最高地址,因此这四个字节变为0x12345678。

示例2:地址307处的字节(即'e')为零扩展(清除了三个最高有效字节)并放在o2中。

示例3:数据必须在其自然边界上对齐。地址303不是半字对齐的,因此结果可能是memory_address_not_aligned陷阱。

示例4:半字0x009a sign-extended0x0000009a(第15位被复制到所有16个最高有效位中)并置于o4中。前导零无关紧要,因此0x0000009a0x9a相同。

示例5:将字节0x9a符号扩展为0xffffff9a(将第7位复制到所有24个最高有效位中)并放入o5