C 分段错误-原因是什么
我正在学习32位汇编,我需要代码方面的帮助。我试图将4放入索引3处的表中,该表通过参数传递给可装配代码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
.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我添加了一个答案,可能会提供更多信息