Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux Segfault访问BSS存储器_Linux_Assembly_Nasm - Fatal编程技术网

Linux Segfault访问BSS存储器

Linux Segfault访问BSS存储器,linux,assembly,nasm,Linux,Assembly,Nasm,。 . 这段代码应该是最有效的,至少在纸上是这样。我需要在汇编中完成一些作业,而无需链接C库,因此我重新发明了控制盘,并提出了一种将数字从控制台读入EAX的方法 我有一个神秘的SEGFULT在行标记的评论,我看不出我可以尝试访问未对齐的内存。。。有没有关于这怎么会失败的想法 是否有可能int 80h正在更改ecx或edx导致指针读取错误?如果您可以在该指令之前和之后读取调试器中的寄存器,则可以确认。我已将bufChar声明为.data,显然mov'。不幸的是,我浪费了一周的时间来思考这个问题,

。 .

这段代码应该是最有效的,至少在纸上是这样。我需要在汇编中完成一些作业,而无需链接C库,因此我重新发明了控制盘,并提出了一种将数字从控制台读入EAX的方法


我有一个神秘的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 us
bufChar
。有一些系统调用可能会更改更多寄存器,但不会更改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