您好,我一直在网上查看,我的书并没有解释加载指令如何适用于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
我只需要帮助解释为什么我能理解这个概念。感谢
答案 0 :(得分:2)
如果你的书真的没有解释,那么你应该寻找其他资源,比如SPARC架构手册。
要得出问题中给出的结果,需要在您的问题中提及一些假设:第一个是o0
的值是300
,第二个是该数据是在little-endian byte order。
示例1:应该是显而易见的(除了它包含一个拼写错误;它很可能读取ld [%o0], %o1
):四个字节0x78,0x56,0x34,0x12被加载到o1
。在小端布局中,最低有效字节位于最低地址,最高有效字节位于最高地址,因此这四个字节变为0x12345678。
示例2:地址307
处的字节(即'e'
)为零扩展(清除了三个最高有效字节)并放在o2
中。
示例3:数据必须在其自然边界上对齐。地址303
不是半字对齐的,因此结果可能是memory_address_not_aligned
陷阱。
示例4:半字0x009a
sign-extended为0x0000009a
(第15位被复制到所有16个最高有效位中)并置于o4
中。前导零无关紧要,因此0x0000009a
与0x9a
相同。
示例5:将字节0x9a
符号扩展为0xffffff9a
(将第7位复制到所有24个最高有效位中)并放入o5
。