Я пишу компилятор и codegen следующий код с ошибкой.Вопрос в том, что mov [esi+4], DWORD temp_fun_2
дает относительный адрес, такой как 0xc5
, используя gdb, тогда как реальный адрес - что-то вроде 0x555f55c5
.Когда я называю этот адрес, он дает мне ошибку сегмента.Так как я могу решить эту проблему?
Среда x86
Заранее спасибо.
section .text
extern print
extern error
extern equal
global our_code_starts_here
our_code_starts_here:
mov esi, [esp+4]
add esi, 8
and esi, 0xFFFFFFF8
push ebp
mov ebp, esp
sub esp, 4
jmp near temp_after_1
temp_fun_2:
push ebp
mov ebp, esp
sub esp, 0
mov ecx, [ebp+8]
mov eax, [ebp+12]
and eax, 1
cmp eax, 0
jne near error_non_int
mov eax, 10
and eax, 1
cmp eax, 0
jne near error_non_int
mov eax, [ebp+12]
add eax, 10
jo near overflow_check
mov esp, ebp
pop ebp
ret
temp_after_1:
mov [esi+0], DWORD 1
mov [esi+4], DWORD temp_fun_2
mov eax, esi
add eax, 5
add esi, 8
mov [ebp-4], eax
mov eax, [ebp-4]
and eax, 7
cmp eax, 5
jne near error_non_fun
mov eax, [ebp-4]
sub eax, 5
mov eax, [eax+0]
cmp eax, 1
jne near arity_non_equal
push DWORD 12
mov eax, [ebp-4]
sub eax, 5
push eax
mov eax, [eax+4]
call eax
add esp, 8
mov esp, ebp
pop ebp
ret
overflow_check:
push DWORD 3
call error
error_non_int:
push DWORD 1
call error
error_non_bool:
push DWORD 2
call error
error_non_pair:
push DWORD 4
call error
error_too_small:
push DWORD 5
call error
error_too_large:
push DWORD 6
call error
error_index_non_int:
push DWORD 7
call error
error_prim1_non_int:
push DWORD 8
call error
error_non_fun:
push DWORD 9
call error
arity_non_equal:
push DWORD 10
call error