我从未参加过大会,我们刚刚在学校开始,教授给了我们这个代码,但我没有得到正确的答案,我不知道是什么......你能看到问题吗?
.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
答案 0 :(得分:1)
您应该提供比我们更多的信息:
您需要“装配”方面的帮助。嗯,什么组装?我猜你是在为x86写作,但你可能想在你的问题中明确表达。此外,注释您的代码,尤其是在汇编中。人们不容易阅读。此外,当您将代码翻译成英语时,请翻译所有代码。您的代码中不存在您的跳转目标。
无论如何,你很幸运,因为这个程序很简单,无论如何都可以阅读其中的一些内容:
在main()
- 函数中,您调用string()
(这是一个错误的名字......),但在string()
返回后,会发生什么?是的,堆栈指针增加了8。等等, 8 ?但是你只在pushl $string_A
中推了一个指针!这只是32位(或 4 字节)
建筑! - >失败。
即使没有爆炸,之后你也不会退回或退出。你只需继续线性执行...直接进入string()
。所以现在string从它应该的位置读取它的指针8 + 4 = 12 字节。如果页面访问冲突尚未发生段错误,那么该指针可以指向任何位置。
我可以尝试对string()
中的跳转进行逆向工程,但是你应该发布可读的代码,所以我不会。