繁体   English   中英

组件x86的推/弹出分段错误

[英]Push/Pop segmentation fault at Assembly x86

我正在使用elf64编译我的程序集x86代码:我有以下子例程:

printNumber:
    mov EAX, EDX ; EDX contain some value like "35"
    mov ESI, 10 ; to divide by 10
    MOV ECX,0 ; counter
    whileDiv:
            cmp EAX, 0 
            je endWhileDiv
            xor rdx, rdx ; clean RDX
            idiv ESI ; EAX=EAX/10  and EDX = EAX%10

            push rdx ; this line generate a segmentation fault

            add ECX, 1; count how many items i has added into stack
            jmp whileDiv
    endWhileDiv:
    ret 

我正在尝试使用push将数字的所有数字推入我的堆栈,但出现分段错误。 当我评论此行时:

 push rdx ; this line generate a segmentation fault

我不会再遇到“细分错误”

我使用“ push rdx”而不是“ push EDX”,因为我在NASM使用64位模式,并且当我尝试使用:“ push EDX”时,出现此错误:“ 64位不支持指令模式”

拜托,有人可以帮忙告诉我为什么会这样以及如何解决?

PS:对不起,我英语不好

我看到一个推rdx,但没有弹出rdx。 您一直将值压入堆栈,当到达RET时,您将返回到RDX以前的地址。

那不是“ PUSH EDX”而不是“ PUSH RDX”吗? 或者,如果您确实需要推送64位数据,也许是PUSH dword ptr 0 / PUSH EDX组合? 想知道它是否最终会变得不结盟并且不喜欢它? 先前的x86模式不关心对齐,但是也许它适用于x64指令?

指令

push rdx;

仅在极少数情况下,它本身就可能导致分段错误:当您的堆栈用完时,或者当您弄乱(E)SP时。 因为您可以运行该代码,所以我认为您没有做第二件事,如果您的应用程序全部这样做,那么第一件事是不现实的。 但是迈克尔在上面指出了正确的方向:导致分段错误的不是推式指令,而是在ret之前弹出的错误信息。 在函数的最后,堆栈必须包含与开始时完全相同的元素数,否则ret指令将读取堆栈底部的内容,并尝试将其用作返回地址-> bang。

您不能使用堆栈以这种方式返回值。 您(例如)需要调用函数为返回数据分配内存并提供其地址作为参数。 阅读有关以汇编语言调用约定和传递参数的信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM