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



我的程序不工作,我想对堆栈中的元素求和。我在堆栈中吐出了数字,然后我想通过从堆栈中恢复它们来求和,并将结果粘贴在eax寄存器中。

.code32
#######################################
.data
msgFin:   .string "n-----n"
sizeMsg = . - msgFin
msgA: .string "additionn"
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

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

提前谢谢你。

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

许多原因:

  • 在代码中过早清空累加器%eaxandl $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
    

    不将结果的文本表示的地址放在CCD_ 8中,也不定义大小CCD_。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!

最新更新