LINUX.ORG.RU

LSR в ARM


0

0

Есть знакомые с ассемблером ARM?

Почему в режиме адресации 1 (addresseing mode 1) у инструкции LSR такое 
разное поведение при нулевом смещении при указании константы и регистра?

Почему в одном  случак shifter_operand = Rm, а в другом 0? 
В той-же инструкции LSL все в порядке.

-------
<Rm>, LSR #<shift_imm>

if shift_imm == 0 then
    shifter_operand = 0  // ???????
    shifter_carry_out = Rm[31]
else /* shift_imm > 0 */
    shifter_operand = Rm Logical_Shift_Right shift_imm
    shifter_carry_out = Rm[shift_imm - 1]
----------
<Rm>, LSR <Rs>

if Rs[7:0] == 0 then
    shifter_operand = Rm  // ???????
    shifter_carry_out = C Flag
else if Rs[7:0] < 32 then
    shifter_operand = Rm Logical_Shift_Right Rs[7:0]
    shifter_carry_out = Rm[Rs[7:0] - 1]
else if Rs[7:0] == 32 then
    shifter_operand = 0
    shifter_carry_out = Rm[31]
else /* Rs[7:0] > 32 */
    shifter_operand = 0
    shifter_carry_out = 0
--------
★★★★

The form of the shift field which might be expected to correspond to LSR #0 is used to encode LSR #32, which has a zero result with bit 31 of Rm as the carry output. Logical shift right zero is redundant as it is the same as logical shift left zero, so the assembler will convert LSR #0 (and ASR #0 and ROR #0) into LSL #0, and allow LSR #32 to be specified.

На уровне ассемблера поведение совершенно одинаковое.

anonymous
()
Ответ на: комментарий от vasirck

Да, спасибо. Я уже после понял, что это способ указать сдвиг в 32. И тогда все сходится.

alexru ★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.