Павел, вы путаете биты и регистры. Один регистр — 16 бит. Правильно будет так:
8 бит чтение (регистр 0, биты 0-7 *)
8 бит чтение (регистр 0, биты 8-15 *)
8 бит запись (регистр 1, биты 0-7 *)
8 бит запись (регистр 1, биты 8-15 *)
Float чтение (регистры 2-3 )
Выравнивание в этом случае себя не проявляет. Чтобы проявило, можно удалить "8 бит":
8 бит чтение (регистр 0, биты 0-7 *)
8 бит чтение (регистр 0, биты 8-15 *)
8 бит запись (регистр 1, биты 0-7 *)
Float чтение (регистры 2-3 )
Или даже два раза по "8 бит":
8 бит чтение (регистр 0, биты 0-7 *)
8 бит чтение (регистр 0, биты 8-15 *)
Float чтение (регистры 2-3 )
И даже единственные 8 бит будут выталкивать Float на регистр 2:
8 бит чтение (регистр 0, биты 0-7 *)
Float чтение (регистры 2-3 )
В этих случаях перед регистром 2 просто образуется дыра.
Узлы выравниваются до кратных своему размеру адресов. Float занимает два регистра, и поэтому может располагаться только по адресам 0, 2, 4, 6, 8 и т.д. То же самое с 32-битными целыми (тоже по два регистра). Регистры укладываются в единицы — следовательно, идут по адресам 0, 1, 2, 3, 4... А 8-битные узлы занимают пол-регистра, и потому могут укладываться по два в один регистр: 0, 0.5 (биты 8-15), 1, 1.5 (биты 8-15) и т.д.




Ответить с цитированием