我的程序不起作用,我想对堆栈中的元素求和。 我在堆栈中添加了数字,然后想要通过从堆栈中还原它们来求和并将结果粘贴在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
我不知道为什么我的程序没有显示卡住的元素之和的结果。
提前谢谢您。
答案 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
中,也不定义大小%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!