C 分段错误-原因是什么

C 分段错误-原因是什么,c,arrays,assembly,segmentation-fault,arguments,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

我正在学习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]);
    }
}
#包括
int main(){
常数静态整数n=5;
int tab[n];
INTA;
对于(a=0;a

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

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

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

  • 您是否已验证代码正在编译为32位进程?在这种情况下会有很大的不同。你试过使用调试器吗?@Taylor Flores-这就是问题所在。谢谢大家!@user1719194我添加了一个答案,可能会提供更多信息