使用push和pop的堆栈中元素的总和

时间:2018-10-31 10:34:14

标签: assembly sum

我的程序不起作用,我想对堆栈中的元素求和。 我在堆栈中添加了数字,然后想要通过从堆栈中还原它们来求和并将结果粘贴在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 :(得分:0)

  

我不知道为什么我的程序没有显示卡住的元素之和的结果。

许多原因:

  • 您在代码中过早清空了累加器%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中,也不定义大小%edxmovl %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!