Почему в коде 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 из памяти для регистрации), а также познакомит вас со способами использования стека для управления временными значениями.