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

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

4

1 回答 1

0

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

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