lw
wymaga, aby adres, który ładujesz, był wyrównany do słowa (tj. Adres musi być wielokrotnością 4).
Więc powiedzmy, że masz masz tej tablicy znajduje się pod adresem 0x1000:
array: .byte 0,1,2,3
I chcesz załadować drugi bajt (1
), która znajduje się pod adresem 0x1001, co nie jest słowo -równoległy. To oczywiście nie zadziała, chyba że zrobiłeś lw
z adresu 0x1000, a następnie wykonałeś kilka przesuwania i ANDing, aby uzyskać żądany bajt, co byłoby prawdziwym kłopotem jako programista.
Załóżmy, że chcesz załadować 0
, który jest zlokalizowany pod adresem wyrównanym do słowa i porównać go z pewną wartością. Więc robisz lw
z adresu 0x1000, ale teraz twój rejestr docelowy będzie zawierał 0x00010203
lub 0x03020100
(w zależności od endianness), a nie tylko 0
. Zanim więc dokonasz porównania, będziesz musiał zrobić bitową operację AND, aby wyodrębnić żądany bajt.
Na pewno widać, że bardzo niewygodne byłoby wykonywanie tych dodatkowych kroków, gdy trzeba przetworzyć pojedyncze bajty danych - co w większości programów jest dość powszechną operacją.
Oryginalna Alpha nie miała instrukcji ładowania/zapisywania podrzędnego. Możesz dostać dość daleko bez nich, ale Alpha musiała w końcu rozszerzyć zestaw instrukcji o te instrukcje dla systemów wieloprocesorowych. – EOF