Сумма префикса языка ассемблера
Поэтому мне поручено написать ассемблерный код, который будет выполнять сумму префикса для набора чисел.
Данный пример был 2 4 6 -1
и возвращение должно быть 12 10 6
, -1
служит пробкой.
jmp main
prefix: addl %edx, %eax
ret
print: irmovl $32, %ecx
wrint %eax
wrch %ecx
ret
read: pushl %ebp # ON_ENTRY saving old frame ptr
rrmovl %esp, %ebp # ON_ENTRY set new frame ptr
mrmovl 8(%ebp), %edx # Retrieving parameter
irmovl $1, %ecx # writing ecx with 1
addl %ecx, %esi
addl %edx, %ecx # adding edx and ecx
je baseCase # checking if they equal 0
recStep: rdint %ebx # reading parameter from user
pushl %ebx
call read
popl %ebx
mrmovl 8(%ebp), %edx
pushl %edx
call prefix
popl %edx
call print
jmp end
baseCase: irmovl $0, %eax
end: rrmovl %ebp, %esp # ON_EXIT reset stack ptr
popl %ebp # ON_EXIT restore old base/frame ptr
ret # ON_EXIT
main: irmovl $0x1000, %esp # init stack ptr
irmovl $-1, %esi
rdint %ebx # reading parameter from user
pushl %ebx # pushing parameter
call read # function call
popl %ebx # removing parameter
call prtnl
halt
prtnl: irmovl $10, %edx # assuming edx is caller save
wrch %edx
ret
Так что в основном мой код печатает 6 10 12
и мне нужно найти способ обратить вспять этот вывод. Есть идеи?
1 ответ
Таким образом, в основном мой код печатает 6 10 12, и мне нужно найти способ изменить этот вывод. Есть идеи?
Да, не используйте рекурсию - нет причин злоупотреблять стеком больше, чем нужно.
Вместо этого сохраните каждый вход в стек, как только вы его получите. Затем обрабатывайте его как массив - перебирайте каждый элемент и вычисляйте для него сумму префикса. То, что я хотел бы сделать, это использовать один регистр, чтобы указать, где первый элемент начинается в стеке, и использовать разницу между esp
и чтобы получить длину массива. Я бы также использовал другой регистр для накопления суммы при получении ввода.
Сумма префикса для каждого элемента может быть вычислена путем вычитания аккумулятора из текущего array[i]
и сохранение результата обратно в накопитель для следующего элемента.