分段错误 - 原因是什么

时间:2013-06-19 22:16:34

标签: c arrays assembly segmentation-fault arguments

我正在学习32位汇编,我需要有关代码的帮助。我试图将4放在索引3的表中,该表通过参数传递给可置信的代码。

.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]);
    }
}

当我运行它时,我收到错误:分段错误(代码转储)。我已经读过,我正在尝试访问不存在的内存。我该如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

正如我上面评论的那样,问题是该进程正在编译为64位进程。这是一个问题,原因有两个:

  1. x64-linux使用的系统调用表与x86-linux不同。由于您没有调用直接系统调用,这可能不是错误 - 但需要注意的是。 例如,write中的0x04不是x64-linux,而是0x01。 (有关x64-linux系统电话号码的信息,请参阅this table
  2. 显然,x64-linux具有更大的指针大小。因此,当加载32位地址时,该地址的随机32位上半部分可能指向任何地方。这也会影响函数堆栈中的值(它们调用包含8字节偏移,而不是4)这很可能是导致此代码出现问题的原因。