Ниже приведена домашняя задача для класса на ассемблере.Мы должны создать код Y86, читая код X86, сгенерированный из C в GDB.Назначение функции - суммировать элементы связанного списка.
В настоящее время функция работает, она работает!Правильное значение содержится в регистре% eax после завершения программы.К сожалению, это правильно только из-за взлома.Я добавил инструкцию halt
прямо в конце функции, прямо перед инструкцией ret
.Если я раскомментирую это, то произойдет то, что при выполнении инструкции ret
ПК устанавливается на 0x0.Другими словами, кажется, что все начинается сначала, когда то, что он должен сделать, это вернуться к точке, где он был вызван.Он входит в бесконечный цикл.
Код следует.Это автономно, если у вас установлен симулятор Y86.
.pos 0
init: irmovl Stack, %esp
irmovl Stack, %ebp
jmp Main
Main:
irmovl ele1, %eax
pushl %eax
call sum_list
halt
sum_list:
pushl %ebp
rrmovl %esp, %ebp
irmovl $16, %edx
subl %edx, %esp
irmovl $0, %edx
rmmovl %edx, -4(%ebp)
jmp L2
L3:
mrmovl 8(%ebp), %eax
mrmovl (%eax), %eax
mrmovl -4(%ebp), %edx
addl %eax, %edx
rmmovl %edx, -4(%ebp)
mrmovl 8(%ebp), %eax
mrmovl 4(%eax), %eax
rmmovl %eax, 8(%ebp)
L2:
irmovl $0, %ecx
mrmovl 8(%ebp), %edx
subl %ecx, %edx
jne L3
mrmovl -4(%ebp), %eax
rrmovl %esp, %ebp
popl %ebp
halt #THIS DOESN'T BELONG. COMMENT OUT TO SEE BAD BEHAVIOR.
ret
#linked list
.align 4
ele1:
.long 0x00a
.long ele2
ele2:
.long 0x0b0
.long ele3
ele3:
.long 0xc00
.long 0
.pos 0x300
Stack:
Спасибо за вашу помощь!