Я пишу следующую программу в NASM, чтобы попрактиковаться в смещении, адресации, таблицах и т. Д.
t_addr:
dw rout1-@, rout2-@
@ equ $
_start:
mov esi, rout1
call esi
call _start_reloc
_start_reloc:
pop ebp
sub ebp, _start_reloc-@
xor eax, eax
add eax, 1
sal eax, 1
lea esi, [ebp+t_addr-@]
mov ax, word [esi+eax]
add eax, ebp
call eax
ret
rout1:
mov eax, 0
ret
rout2:
xor eax, eax
ret
Хотя первые две инструкции после метки _start работают так, как должны, ипередать управление в функцию rout1 , когда я пытаюсь получить доступ к функции rout2 , используя смещение из таблицы, и пока в GDB я смотрю значение eax перед инструкцией call eax и содержит адрес rout2 при выполнении вызова, я получаю ошибку сегментации, и EIP загружается с 0x00000001.ПОЧЕМУ ???
ps: я использую Linux 32-бит.