Сумма элементов в стеке с использованием push и pop - PullRequest
0 голосов
/ 31 октября 2018

Моя программа не работает, я хочу суммировать элементы, которые находятся в стеке. Я собрал числа в стеке, а затем хочу сложить их, восстановив их из стека, и поместил результат в регистр eax.

.code32

#######################################
.data
msgFin:   .string "\n-----\n"
sizeMsg = . - msgFin

msgA: .string "addition\n"
sizemsgA = . - msgA

number:   .long 0

#######################################
.bss

#######################################
.text

.global _start

_start:   
andl $0, %eax

initialisePile:
push %ebp
movl %esp, %ebp

empile:
movl $1, %edx
push %edx
movl $2, %edx
push %edx
movl $3, %edx
push %edx
movl $4, %edx
push %edx
movl $5, %edx
push %edx

showAddition:
movl $msgA, %ecx 
movl $4, %eax 
movl $1, %ebx 
movl $sizemsgA,%edx 
int $0x80

additionStack:
pop %edx
addl %edx,%eax
cmpl %esp,%ebp
je exit
jmp additionStack

exit:
movl $4, %eax 
movl $1, %ebx 
movl $msgFin,%ecx  
movl $sizeMsg,%edx 
int $0x80

show result:
movl %eax,$number
movl $number,%ecx
movl $4, %eax 
movl $1, %ebx 
int $0x80

exit2:
movl $0, %ebx   
movl $1, %eax  
int $0x80

Я не знаю, почему моя программа не показывает результат суммы элементов в застрявшем.

Заранее спасибо.

1 Ответ

0 голосов
/ 31 октября 2018

Я не знаю, почему моя программа не показывает результат суммы элементов в застрявшем.

Ряд причин:

  • Вы разряжаете аккумулятор %eax слишком рано в коде! Ваша инструкция andl $0, %eax должна находиться прямо перед циклом, в котором вы фактически делаете дополнения. Как вы и написали, регистр тем временем использовался для чего-то другого. (Призыв показать первое сообщение movl $4, %eax).

  • Вы потеряете результат добавления, потому что регистр %eax будет поврежден при вызове для отображения второго сообщения! Инструкция movl %eax,$number находится непосредственно под циклом сложения.

  • Чтобы показать полученное число, вы использовали ту же функцию API, что и для отображения текстовых сообщений. Регистр %ecx содержит адрес, а %edx - размер.
    Но этот код:

    show result:
    movl %eax,$number    <- Binary form
    movl $number,%ecx
    movl $4, %eax 
    movl $1, %ebx 
    int $0x80
    

    не помещает адрес текстового представления результата в %ecx и не определяет размер %edx. Инструкция movl %eax,$number хранит только двоичное представление результата.
    Либо используйте функцию API, которая может выводить числовое значение, либо преобразовать число в текст самостоятельно.


Ваш код с несколькими исправлениями добавлен:

_start:   

initialisePile:
  push %ebp
  movl %esp, %ebp

empile:
  push $1
  push $2
  push $3
  push $4
  push $5

showAddition:
  movl $msgA, %ecx 
  movl $4, %eax 
  movl $1, %ebx 
  movl $sizemsgA,%edx 
  int  $0x80

  xorl %eax, %eax    ; better than 'andl $0, %eax'
additionStack:
  pop  %edx
  addl %edx,%eax
  cmpl %esp,%ebp
  jne  additionStack
  movl %eax,$number  ; don't loose the sum

exit:
  movl $4, %eax 
  movl $1, %ebx 
  movl $msgFin,%ecx  
  movl $sizeMsg,%edx 
  int  $0x80

; Here you decide how you want to show the n u m b e r!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...