Доступ к памяти malloc'd в сборке - PullRequest
1 голос
/ 16 декабря 2011

Я пытаюсь получить доступ к памяти, у которой есть ошибки в сборке, но я постоянно получаю ошибки segfault. Что я делаю неправильно в следующем коде, я уверен, что это просто, но я просто не вижу этого!

РЕДАКТИРОВАТЬ: Я использую 64-битную сборку NASM

; Allocate room for 8 integers
mov r8, 8
mov rdi, r8
imul rdi, 8 ; Multiply by 8 (8 bytes per entry in 64bit)
xor rax, rax
call malloc
add rsp, 8
test rax, rax
jz malloc_failure
mov r8, rsp

; r8 now = base of array

; Set the first element to be 100
mov r9, 0
add r9, r8
mov qword [r9], 100

malloc_failure:
deallocate_start:
dealloc_1:
mov rdi, r8
xor rax, rax
call free
add rsp, 8
deallocate_end:
call os_return      ; return to operating system

И сегфо (не очень интересно ...)

matrix05% ./arr5
Segmentation fault

1 Ответ

2 голосов
/ 16 декабря 2011
mov r8, 8
mov rdi, r8
imul rdi, 8
xor rax, rax
call malloc
add rsp, 8       ;; here we _add_ 8 bytes to the stack pointer
                 ;; this is equivalent to _popping_ off the stack
                 ;; remember, the x86 stack grows down!
test rax, rax    ;; rax is indeed where the return value is..... but:
jz malloc_failure
mov r8, rsp      ;; we overwrite r8 with the stack pointer (why??)

; r8 now = base of array ;; no it's not

mov r9, 0
add r9, r8       ;; r9 = r8 = stack pointer
mov qword [r9], 100  ;; we now write 100 to the current stack pointer.
                 ;; The stack pointer initially (on entry to the function)
                 ;; pointed to a return address; where exactly are you overwriting?

malloc_failure:
deallocate_start:
dealloc_1:
mov rdi, r8
xor rax, rax
call free
add rsp, 8       ;; we pop from the stack pointer _again_. I do hope there's a sub rsp, 16 at the top...
deallocate_end:
call os_return      ; return to operating system (and probably crash because our stack is FUBAR'd)
...