我的程序不工作,我想对堆栈中的元素求和。我在堆栈中吐出了数字,然后我想通过从堆栈中恢复它们来求和,并将结果粘贴在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
我不知道为什么我的程序没有显示卡住中元素总和的结果。
提前谢谢你。
我不知道为什么我的程序没有显示卡住中元素的总和的结果。
许多原因:
-
在代码中过早清空累加器
%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
不将结果的文本表示的地址放在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!