如果我在汇编时启动子程序,我的堆栈指针%esp正在瞄准a 在开始时返回值。
mov %esp,%edi # copy return address to %edi mov $0xff,%cl # write 255 in %ecx (it was 0x0 before) mov %ecx,(%edi) # copy 255 to... the stack point, the return
地址瞄准? #或只是覆盖返回地址?
答案 0 :(得分:1)
在英特尔,你是正确的,在调用函数之前将返回地址推送到堆栈。
它不是堆栈的地址,而是一旦调用的函数完成后返回的指令的地址。例如,如果您有一个如下所示的程序:
instruction1
instruction2
call someFunction
instruction3
instruction4
当someFunction
完成时,它将跳回并继续执行instruction3
。它知道返回的位置,因为执行instruction3
指令时call
的地址被推送到堆栈。 someFunction
将使用ret
地址将该地址弹出堆栈并返回。
您的示例会按照您的建议覆盖函数的返回地址 - 您可能不想这样做。