2013-06-19 43 views
0

我正在学习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]); 
    } 
} 

当我运行它,我得到错误:段错误(倾倒代码)。我读过,我试图访问不存在的内存。我该如何解决这个问题?

+0

你验证的代码被编译为一个32位进程?它在这种情况下产生了很大的区别 – tay10r

+0

您是否尝试使用调试器进行调试? – Elazar

+0

@泰勒弗洛雷斯 - 这是问题所在。谢谢! –

回答

0

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

  1. x64-linux使用不同的系统调用表比x86-linux。既然你不打电话给一个直接的系统调用,这可能不是错误 - 但这是一件需要注意的事情。 例如,write是在x64-linux0x04,它是0x01。 (有关x64-linux系统呼叫号码,请参阅this table)。
  2. 显然,x64-linux具有较大的指针大小。所以当一个32位地址被加载时,该地址的一个随机32位上半部分可能指向任何地方。这也影响在一个函数的栈(他们称之为包含8字节偏移量,而不是4)这是最有可能发生了什么在此代码导致该问题的值。