Linux Segfault访问BSS存储器
。 . 这段代码应该是最有效的,至少在纸上是这样。我需要在汇编中完成一些作业,而无需链接C库,因此我重新发明了控制盘,并提出了一种将数字从控制台读入EAX的方法Linux Segfault访问BSS存储器,linux,assembly,nasm,Linux,Assembly,Nasm,。 . 这段代码应该是最有效的,至少在纸上是这样。我需要在汇编中完成一些作业,而无需链接C库,因此我重新发明了控制盘,并提出了一种将数字从控制台读入EAX的方法 我有一个神秘的SEGFULT在行标记的评论,我看不出我可以尝试访问未对齐的内存。。。有没有关于这怎么会失败的想法 是否有可能int 80h正在更改ecx或edx导致指针读取错误?如果您可以在该指令之前和之后读取调试器中的寄存器,则可以确认。我已将bufChar声明为.data,显然mov'。不幸的是,我浪费了一周的时间来思考这个问题,
我有一个神秘的SEGFULT在行标记的评论,我看不出我可以尝试访问未对齐的内存。。。有没有关于这怎么会失败的想法 是否有可能
int 80h
正在更改ecx
或edx
导致指针读取错误?如果您可以在该指令之前和之后读取调试器中的寄存器,则可以确认。我已将bufChar声明为.data,显然mov
'。不幸的是,我浪费了一周的时间来思考这个问题,我刚刚意识到了这一点。使用objdump-d obj.o
来验证mov ecx,bufChar
确实加载了地址(而不仅仅是偏移量或变量的内容)。mov ecx,bufChar正在转换为mov$0x0,%ecx。。。。它真的试图移动到0x00000000吗?我想知道…它是真的在移动上中断了,还是EIP当前指向的指令(这似乎暗示了它之前的系统调用)?@Machinarius:这是GAS/at&T语法;源操作数和目标操作数与大多数x86汇编程序显示它们的方式相反mov$0x0,%ecx
相当于mov ecx,0
int 80h
“不应”修改任何寄存器,但eax
(结果或错误)bufChar
未显示,因此我们不知道它是什么bufNum
和bufMult
各保留一个字节,您将eax
(4个字节)移到其中。这个“可能”不会错,但它错了!Show usbufChar
。有一些系统调用可能会更改更多寄存器,但不会更改eax,例如:waitpid-等待进程终止。如果ecx中输入了非零值,则返回值为:eax已完成流程的pid | ECHILD | EINVAL | ERESTART,ecx已完成流程的退出状态。
section .data
bufChar: equ 0
section .bss
bufNum: resb 1
bufMult: resb 1
leerNumero:
xor eax,eax
mov [bufNum],eax
add eax,1
mov [bufMult],eax
inicioLeerNumero:
mov edx,1
mov ecx,bufChar
mov ebx,0
mov eax,3
int 80h
cmp byte [ecx + edx - 1],10 ; Segfaults here.
je rLeerNumero
cmp byte [ecx + edx - 1],48
jl noNumero
cmp byte [ecx + edx - 1],57
jg noNumero
sub eax,48
mul word [bufMult]
jo overflow
add [bufNum],eax
jo overflow
mov eax,10
mul word [bufMult]
jo overflow
mov [bufMult],eax
jmp inicioLeerNumero
rLeerNumero:
mov eax,bufNum
ret
noNumero:
mov eax,errorNumero
mov ebx,lErrorNumero
call imprimir
jmp salir
overflow:
mov eax,errorOverflow
mov ebx,lErrorOverflow
call imprimir
jmp salir