将十六进制值存储到寄存器时的分段错误

时间:2015-11-12 23:08:31

标签: c assembly segmentation-fault

我正在使用C中的一个类调用程序集中的类.C类发送2个整数作为参数,但这不相关,因为我遇到了一个我似乎不太明白的分段错误错误这是为什么。

这是程序集类的相关部分:

.global testingclass testingclass:

pushl %ebp
movl %esp, %ebp
subl $4, %esp               #reserves space for local variable

movl 8(%ebp), %ebx          #first argument of the function to %ebx
movl 12(%ebp), %ecx         #second argument of the function to %ecx

function:

movl $0, %eax ----------------< segmentation fault

movl 0x0000FFFF, %eax
and %bx, %ax
movw %ax, -4(%ebp)      
...

我签署了在调试时给出分段错误错误的行。我真的不知道一个简单的移动命令如何触发分段错误,但希望你能帮助我。

这是调试器控制台输出:

 ...
 11     movl 12(%ebp), %ecx         #second argument of the function to %ecx
(gdb) n
function() at asm.s:16
16      movl 0x0000FFFF, %eax
(gdb) n

Program received signal SIGSEGV, Segmentation fault.
function() at asm.s:16
16      movl 0x0000FFFF, %eax

1 个答案:

答案 0 :(得分:1)

此指令发生了seg错误:

movl 0x0000FFFF, %eax

不在此指示:

movl $0, %eax

seg故障的原因是从地址(64k-1)读取

程序只能读/写用户空间可用的地址。

由于OS是第一个,在中断向量之后,代码试图读取OS代码中的地址。操作系统代码不属于用户空间。