сборка segfault при вызове printf [duplicate]

я только что успешно использовал:

>>> type(tstamp)
pandas.tslib.Timestamp
>>> newDt = tstamp.date()
>>> type(newDt)
datetime.date
0
задан gilianzz 29 July 2015 в 15:45
поделиться

2 ответа

Подпрограмма print_string изменяет указатель стека без его восстановления. Подпрограмма main имеет следующий макет:

push ebp    ;save the stack frame of the caller
mov ebp, esp    ;save the stack pointer
<code for subroutine>
mov esp, ebp    ;restore the stack pointer
pop ebp    ;restore the caller's stack frame
ret ;return to address pushed onto the stack by call

Аналогично, подпрограмма print_string должна иметь тот же макет, сохраняя указатель стека, а затем восстанавливая его до ret ing. Любые подпрограммы, которые используют стек, должны сохранять и восстанавливать указатель стека.

push ebp
mov ebp, esp
pusha
push msg
call printf ;should print "Hello"
add esp, 4
popa
mov esp, ebp
pop ebp
ret

Не сохраняя указатель стека и восстанавливая его, вызываемая подпрограмма изменяет указатель стека, где команда call сохранила адрес возврата , Следовательно, когда встречается ret, выполнение переходит к неправильному адресу возврата, поэтому segfault. Подробнее о вызовах и функциях вызова в сборке.

-1
ответ дан automaton 26 August 2018 в 01:15
поделиться
1
ответ дан Sep Roland 26 August 2018 в 01:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: