2017-02-08 2 views
3

Я перевел этот код до сих пор, и я не понимаю, как вычислить сумму 16-разрядного адреса.Перевести следующий код машинного языка (0x2237FFF1) в сборку MIPS

0x2237FFF1 

Для бинарного

0010 0010 0011 0111 1111 1111 1111 0001 

Теперь я читал опкод (001000) и знаю, что это я типа и addi инструкция

Теперь я группируя бинарник в I-type

op  rs rt  imm 
001000 10001 10111 1111111111110001 
    8  17 23  ? 

Глядя на справочный лист MIPS и выяснили, что инструкция должна быть

addi $s7,$s1,???? 

Я стеком здесь и не знаю метод, как определить 16-битный непосредственный адрес в Genral.

+1

Вы уже нашли сразу, это '1111111111110001'. Можете ли вы преобразовать из двоичного кода? Обратите внимание, что непосредственные символы расширены, поэтому на самом деле '-15' в десятичном формате. – Jester

+1

* «немедленный адрес» * звучит подозрительно для меня, как правило, в Assembly это либо * немедленное * (значение, непосредственно закодированное в инструкции, в вашем случае '0xFFF1' => знак расширен до 32b =' 0xFFFFFFF1' = '-15') , или * адрес * в одном из возможных режимов адресации, один режим, похожий на немедленный, - 'pc + offset', в таком случае это будет адрес' pc-15'. Я пишу это как общую информацию, я не проверял конкретный код операции в справочном руководстве MIPS, поэтому я не знаю, существует ли такой режим адреса в MIPS, но, я думаю, у вас есть немедленный вариант. – Ped7g

+1

Или даже абсолютная адресация будет напоминать немедленное кодирование еще больше, например, когда инструкция содержит абсолютный адрес памяти для работы, но это очень маловероятно для RISC-подобных процессоров, как обычно, они имеют фиксированные инструкции размера «word» и абсолютные адрес обычно требует целого «слова», чтобы определить его. Поэтому, если какая-либо адресация задействована, тогда она будет на 99% относительной, используя значение как смещение с расширением знака. – Ped7g

ответ

2

Вы можете начать, позволяя инструменты сделать это для вас

.word 0x2237FFF1 

затем собрать и разобрать.

mips-elf-as so.s -o so.o 
mips-elf-objdump -D so.o 

so.o:  file format elf32-bigmips 

Disassembly of section .text: 

00000000 <.text>: 
    0: 2237fff1 addi s7,s1,-15 

, а затем делать то, что вы делали, immediates в целом, либо подписаны или нет (вообще внутри и между наборами команд) в этом случае будет либо 0x0000FFF1 или 0xFFFFFFF1 вы можете использовать калькулятор или просто посмотрите на биты, которые вы расширили, twos дополняют отмену инвертирования и добавьте один, чтобы ваш номер стал двоичным 1110 + 1 или 1111, что равно 15, поэтому 0xFFFFFFF1 - это номер подписки -15. Или без знака 0xFFFFFFF1, что бы это ни было, несколько миллиардов.

EDIT

Несчастный, чтобы увидеть мой Binutils используя ABI имен регистров, закреплен так, чтобы:

Disassembly of section .text: 

00000000 <.text>: 
    0: 2237fff1 addi $23,$17,-15 
+0

Спасибо за ответ, теперь он решен, и я использовал два дополнения. Также инвертировал все биты и добавил 1 к наименее значащему биту '0000 0000 0000 1110 +1 = 0000 0000 0000 1111' Это 15 в десятичной, следовательно, число отрицательно, поэтому это -15. – Adam

Смежные вопросы