Exactement ce que fait le lb instruction de le faire?
J'ai un examen à venir, et l'un des problèmes était:
Supposer que
$t0
contient la valeur0x12121212
et$t1
contient
l'adresse0x1000000
.Supposent que la mémoire de données, à partir de l'adresse
0x1000000
est:
88 77 66 55
.Quelle sera la valeur de
$t0
après le code suivant est exécuté:lb $t0, 0($t1)
a)
0x00000088
b)0x88121212
c)0xffffff88
d)0x12121288
La réponse que j'ai donné était a
, parce que l'octet que le lb
en cours de lecture (selon ma compréhension de ce que l'instruction n') est de 88. 88 sera ensuite stockée dans $t0
, par conséquent, la valeur sera 0x00000088
. Mais la réponse donnée était c
. J'ai l'impression d'un malentendu fondamental sur la façon lb
œuvres - quelqu'un peut-il expliquer pourquoi la réponse est c
?
- Ressemble à l'extension du signe pour moi
- Je le croyais aussi, mais je n'ai pas du tout comprendre pourquoi le signe de l'extension a été fait - pourriez-vous expliquer dans une réponse?
Vous devez vous connecter pour publier un commentaire.
La réponse serait
c) 0xffffff88
. Lelb
instructions de connexion s'étend de l'octet dans une valeur de 32 bits. I. e. le bit le plus significatif (msb) est copié dans la partie supérieure de 24 bits.0x88 == 0b10001000, c'est à dire le bit de poids fort est à 1. De sorte que la partie supérieure 24 bits seront 0b111111111111111111111111 == 0xffffff.
La
lb
instruction en charge un octet de la mémoire etsign extends
à la taille du registre. Lelbu
instruction fait la même chose sans l'extension du signe (non signé).http://en.wikipedia.org/wiki/MIPS_architecture#Integer
La plupart des ordinateurs, MIPS inclus, utilisez en complément à deux pour représenter les valeurs signées mais il y a d'autres façons de coder le signe, à virgule flottante est généralement représenté dans La norme IEEE 754 format qui utilise signé ampleur. Un entier signé valeur peut être représentée dans un certain nombre de bits, par exemple
char
en C 8-bits et peut représenter -128 à +127short
en C 16-bits, et peut représenter de -32768 à +32767En complément à deux le bit le plus significatif peut être utilisé pour déterminer le signe d'un nombre, une
'1'
signifie qu'il est négatif, et un'0'
signifie qu'il est positif.Le nombre 0x88, lorsqu'il est interprété comme un 8 bits en complément à deux nombre est négatif 0x78 ou -120 décimal. Lorsque représenté sur 32 bits en complément à deux c'est 0xFFFFFF88. Il ya un couple de façons de se rappeler comment faire pour calculer le complément à deux d'un nombre:
À signer étendre un 8-bit et 32-bits, il suffit de regarder le bit le plus significatif (bit 7) et de la copie que les bits à bits 8 à 31... Cela découle de la définition du complément à deux.
c
.0xffffff
été assez clair), mais je ne comprends pas pourquoi le signe de l'extension a été fait. Copier-coller de la définition standard de lalb
instruction n'est pas très utile..lb
instruction. Si vous ne voulez pas signer d'extension, vous pouvez utiliserlbu
.