2013-06-19 4 views
0

Я изучаю 32-битную сборку, и мне нужна помощь с кодом. Я пытаюсь поместить 4 в таблицу с индексом 3, который передается аргументами в assebly-код.Ошибка сегментации - по какой причине

.code32 

.equ KERNEL, 0x80 # Linux system functions entry 
.equ WRITE, 0x04 # write data to file function 
.equ EXIT, 0x01 # exit program function 

.equ STDOUT, 1 


.equ argTab, 8 
.equ argLicz, 12 
.equ argN, 16 
.equ argZakres, 20 

.text 
    .globl przelicz 
    .type przelicz, @function 

przelicz: 

    pushl %ebp 
    movl %esp, %ebp 

    movl $2, %ecx 
    movl $4, %ebx 

    movl argTab(%ebp), %edx 
    movl %ebx, (%edx,%ecx,4) 


    movl %ebp, %esp 
    popl %ebp 

ret 

я исполню ее с кодом C:

#include <stdio.h> 

int main(){ 
    const static int n = 5; 
    int tab[n]; 
    int a; 
    for(a = 0; a < n; ++a){ 
     tab[a] = a; 
    } 
    int licz[n]; 

    przelicz(tab, licz, 50, 50); 

    for(a = 0; a < n; ++a){ 
     //printf("%d ", licz[a]); 
    } 
} 

Когда я запускаю его я получаю сообщение об ошибке: ошибки сегментации (код сбрасывается). Я читал, что я пытаюсь получить доступ к памяти, которая не существует. Как я могу это решить?

+0

Вы проверили, что код скомпилирован как 32-битный процесс? это имеет большое значение в этом случае – tay10r

+0

вы попробовали пошаговое отладчик? – Elazar

+0

@ Тейлор Флорес - В этом была проблема. Спасибо! –

ответ

0

Как я уже отмечал выше, проблема заключается в том, что процесс компилируется как 64-разрядный процесс. Это проблема, по двум причинам:

  1. x64-linux использует другую таблицу системных вызовов, чем x86-linux. Поскольку вы не вызываете прямой системный вызов, это, вероятно, не ошибка, но это то, о чем нужно знать. Например, write не 0x04 в x64-linux, это 0x01. (См. this table для x64-linux номера системных вызовов).
  2. Очевидно, x64-linux имеет размеры большего указателя. Поэтому, когда загружается 32-разрядный адрес, есть случайная 32-разрядная верхняя половина этого адреса, которая может указывать на любую точку. Это также влияет на значения в стеке функции (они включают в себя 8-байтовые смещения, а не 4). Это, скорее всего, вызывает проблемы в этом коде.
Смежные вопросы