Почему мы подписываем расширение в инструкции загрузки слова? - PullRequest
7 голосов
/ 18 сентября 2011

Я изучаю MIPS 32 бит.Я хотел бы спросить, почему мы подписываем Расширение 16-битного смещения (в одноканальном канале передачи данных) перед отправкой его в ALU в случае Store Word?

Ответы [ 6 ]

10 голосов
/ 21 октября 2011

Я не уверен, будет ли это полезно для вас сейчас, но я все равно публикую это.

Давайте рассмотрим в очень очень общем смысле массив инструкций на C ++, то есть A [0], A [1], A [2] ..... «Переносное» расстояние между любыми двумя инструкциями составляет 1 ЕДИНИЦА.

Давайте возьмем эту аналогию с MIPS. В MIPS, например, каждая инструкция отделена "1 UNIT", однако, 1 UNIT = 4 байта в MIPS. Каждая инструкция имеет длину 4 байта, и поэтому при переходе от инструкции к инструкции ПК увеличивается на 4, то есть ПК + 4. Таким образом, разрыв между инструкцией i и инструкцией i + 2 составляет «образно» 2, но на самом деле 2 * 4 = 8, т.е. PC + 4 + 4

Возвращаясь к смещениям, указанным в инструкциях Ветви, смещение представляет собой «переносное» расстояние от следующей инструкции (инструкции, следующей за Ветвью). Таким образом, чтобы получить «реальное» расстояние, смещение должно быть умножено на 4. Это причина, по которой мы проинструктированы «расширить знак» смещения на 2 бита до «ВЛЕВО», потому что сдвиг влево любого двоичного значения на n битов приводит к умножению этого значения на 2 ^ n. В нашем случае 2 ^ 2 = 4

Таким образом, фактический целевой адрес инструкции перехода - PC + 4 + 4 * Offset.

Надеюсь, это поможет.

8 голосов
/ 18 сентября 2011

Похоже, что 16-битное смещение - это число со знаком 2 со знаком, то есть оно может быть как положительным, так и отрицательным.

При преобразовании его в 32 бита самый старший бит должен быть скопирован в старшие 16 бит, чтобы сохранить информацию знака.

0 голосов
/ 12 августа 2016

Расширение знака происходит, например, на машинах M68xxx только в случае загрузки адресных регистров. В случае регистров данных это не так.

например,

movea.w addr,a0
move    addr,d0
addr:
dc.w $FFFF

приводит в случае загрузки регистра данных к $ 0000FFFF, в случае загрузка регистра адресов, однако, в $ FFFFFFFF.

Чтобы понять это, постройте два дополнения подписанного негатива $ FFFF, увеличьте число до 32 бит и переделайте дополнить, найдя соответствующее представление в 32 бит.

Приветствия и наилучшие пожелания, Стефан С.

0 голосов
/ 09 марта 2014

В аппаратном обеспечении 32-разрядного компьютера большинство АЛУ принимают 32-разрядные входы, а все регистры являются 32-разрядными.

Для работы с вашими данными они должны иметь ширину 32 бита, поэтому мы расширяем SIGN, однако другой подход будет заключаться в расширении ZERO, но расширение SIGN используется, когда вы работаете с немедленными и смещениями для сохранения войдите в 2 дополнения.

0 голосов
/ 08 марта 2014

Я думаю, что вы поняли ваши концепции немного неправильно здесь.

5 битов, которые, по вашему мнению, находятся внутри АЛУ, фактически входят в память регистров, чтобы выбрать один из 32 [2 ^ 5] регистров.

Каждый регистр имеет 32 бита.Следовательно, чтобы добавить смещение к значению регистра, необходимо подписать его, увеличив его до 32 бит.

Работа ALU всегда выполняется между двумя регистрами одинакового размера в канале данных одиночного цикла для MIPS.

0 голосов
/ 27 октября 2013

Насколько мне известно, в инструкциях по загрузке или сохранению значение смещения добавляется к значению во временном регистре, как временная.регистр 32-битный и операция сложения 16-битного и 32-битного невозможна, значение расширено знаком.

...