Почему в коде y86 ожидается ошибка запятой

Может кто-нибудь сказать мне, почему я могу получить эти ошибки. когда я пытаюсь вбежать./yas -

Error on line 22: Expecting Register ID
Line 22, Byte 0x0032:      subl $24, %esp
Error on line 24: Expecting Register ID
Line 24, Byte 0x0036:      subl $0,8(%ebp)
Error on line 27: Expecting Register ID
Line 27, Byte 0x0043:      mrmovl $0, -20(%ebp)
Error on line 33: Expecting Comma
Line 33, Byte 0x005a:      mrmovl %eax, -8(%ebp)
Error on line 38: Expecting Register ID
Line 38, Byte 0x0077:      mrmovl (%eax), -4(%ebp)
Error on line 43: Expecting Comma
Line 43, Byte 0x0091:      mrmovl %edx, -20(%ebp)

В y86 есть инструкция subl, верно? Любая помощь будет оценена.

1 ответ

Я только начинаю изучать y86, но думаю, что могу вам помочь:

Строка проблемы 22) Причина, по которой первые две операции subl дают сбой, заключается в том, что вы можете выполнять операции subl только между двумя регистрами (воспринимайте это как отрицание комплимента двух, примененное к первому регистру, затем добавленное ко второму, только изменяющееся значение второго регистра). Строка решения 22) Используйте стек для хранения значения регистра и загрузки константы для вычитания. Не забудьте восстановить реестр поп!

pushl %edx
irmovl $24, %edx
subl %edx, %exp
popl %edx

Строка проблемы 24) Аналогичная проблема с subl, требующим регистра. Однако вы также пытаетесь непосредственно изменить значение в памяти (так как это второй изменяемый аргумент). Строка решения 24) Используйте стек для хранения двух значений регистра, загрузки константы для вычитания и загрузки значения из памяти. Не забудьте восстановить реестр с помощью pops!

pushl %edx              # edx first in
pushl %ebx              # ebx last in
mrmovl 8(%ebp), %ebx    #move memory integer to ebx
subl %edx, %ebx
rmmovl %ebx, 8(%ebp)    #move register integer to memory
popl %ebx               # ebx first out
popl %edx               # edx last out

Строки задачи 27 && 38) Для целочисленной передачи из памяти в регистр используется операция MRmovl (акцент на M и R вместо R на M в операции rmmovl). Строки решения 27 && 38) Чтобы использовать константы, используйте предыдущие приемы стека. Кроме того, измените порядок, так как адрес памяти -20(%ebp) должен быть первым параметром.

Строки проблем 33 && 43) См. Проблему выше, за исключением того, что теперь регистр действительно используется (стек не требуется). Строки решения 33 && 43) Как и прежде, меняйте параметры, чтобы загрузить значение памяти в регистр%eax.

Надеемся, что это очистит некоторые инструкции с помощью y86 (irmovl из Immediate Value для регистрации, rmmovl из регистра в память и mrmovl из памяти для регистрации), а также познакомит вас со способами использования стека для управления временными значениями.

Другие вопросы по тегам