如何在装配中检查字符串是否为回文? [代码帮助]

时间:2014-01-14 17:36:19

标签: assembly

我从未参加过大会,我们刚刚在学校开始,教授给了我们这个代码,但我没有得到正确的答案,我不知道是什么......你能看到问题吗?

.section .data
    status: .byte 1
    string_A: .ascii "kapak\0"
.section .text
.globl main
main:
    movl $0, %eax
    pushl $string_A
    call string
    addl $8,%esp

.type string, @function
string:
    pushl %ebp
    movl %esp, %ebp
    movl 8(%ebp), %esi
    movl %esi, %edi

    loop:
        movl $4, %esi
        cmpl $0, %esi
        jg petlja
    again:
        movb (%esi), %al
        cmpb (%edi), %al
        je uvecaj
        jne exit
    increase:
        addl $1, %edi
        addl $-1, %esi
        jmp again

    movl %ebp, %esp
    popl %ebp
    ret

exit:
    movl $1,%eax
    movl $0,%ebx
    int $0x80

1 个答案:

答案 0 :(得分:1)

您应该提供比我们更多的信息:

您需要“装配”方面的帮助。嗯,什么组装?我猜你是在为x86写作,但你可能想在你的问题中明确表达。此外,注释您的代码,尤其是在汇编中。人们不容易阅读。此外,当您将代码翻译成英语时,请翻译所有代码。您的代码中不存在您的跳转目标。

无论如何,你很幸运,因为这个程序很简单,无论如何都可以阅读其中的一些内容:

main() - 函数中,您调用string()(这是一个错误的名字......),但在string()返回后,会发生什么?是的,堆栈指针增加了8。等等, 8 ?但是你只在pushl $string_A中推了一个指针!这只是32位(或 4 字节) 建筑! - >失败。

即使没有爆炸,之后你也不会退回或退出。你只需继续线性执行...直接进入string()。所以现在string从它应该的位置读取它的指针8 + 4 = 12 字节。如果页面访问冲突尚未发生段错误,那么该指针可以指向任何位置。

我可以尝试对string()中的跳转进行逆向工程,但是你应该发布可读的代码,所以我不会。