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
Assembly 跳转时的错误代码_Assembly_Nasm - Fatal编程技术网

Assembly 跳转时的错误代码

Assembly 跳转时的错误代码,assembly,nasm,Assembly,Nasm,我正在尝试学习汇编(特别是ideone.com上的nasm变体)。当我跳转到一个过程时,我得到了错误代码11,而当我调用这个过程时,没有错误。我已经试过了,在街区尽头有没有“ret”。请注意,仅当输入的长度为2时才调用_printOne过程,例如“a[newline]”。这是我的密码 global _start section .data sys_read equ 3 sys_write equ 4 max_line_len equ 10 stdi

我正在尝试学习汇编(特别是ideone.com上的nasm变体)。当我跳转到一个过程时,我得到了错误代码11,而当我调用这个过程时,没有错误。我已经试过了,在街区尽头有没有“ret”。请注意,仅当输入的长度为2时才调用_printOne过程,例如“a[newline]”。这是我的密码

global _start

section .data
    sys_read     equ 3
    sys_write    equ 4
    max_line_len equ 10
    stdin        equ 0      
    oneStr       db '1'
    oneStrLen    equ $ - oneStr

section .bss
    line resb 10

segment .text

_start:
    call _readLine           ; stores value in line
    cmp eax, dword 2         ; if input has length of 2, print out '1'
    je _printOne             ; No error if "call _printOne"!
    mov     eax, 01h         ; exit()
    xor     ebx, ebx         ; errno
    int     80h

_readLine:        
    mov eax, sys_read        ; syscall to read
    mov ebx, stdin           ; stdin
    mov ecx, line        ; put line into ecx
    mov edx, max_line_len    ; length to read
    int 0x80
    ret

_printOne:  
    mov eax, sys_write
    mov ebx, stdout
    mov ecx, oneStr
    mov edx, oneStrLen
    int 80h
    ret

如果您只是在最后省略了
RET
,处理器将尝试执行内存中代码之后的任何垃圾,这可能是导致故障的原因

如果要进行条件调用,只需反转条件并跳过调用,例如:

    cmp eax, dword 2
    jne skip_print
    call _printOne
skip_print:
    mov eax, 1
    xor ebx, ebx
    int 80h
如果您不想将
\u printOne
变成一个过程,那么您应该提供一种方法,让执行能够合理地继续,例如通过跳回退出,如下所示:

    cmp eax, dword 2
    je _printOne
exit:
    mov eax, 1
    xor ebx, ebx
    int 80h
    ...
_printOne:
    mov eax, sys_write
    mov ebx, stdout
    mov ecx, oneStr
    mov edx, oneStrLen
    int 80h
    jmp exit

最后,建议:不要使用ideone学习汇编编程。在本地设置一个环境,特别是确保您有一个调试器,在那里您可以单步执行代码并查看发生了什么。

非常感谢您的建议。我之所以使用ideone是因为我们在工作中有竞争,我们必须为我们的解决方案提供ideone链接;此外,我的work comp运行windows,而ideone nasm在Linux中运行