简单程序中的nasm段错误

时间:2015-04-19 12:42:54

标签: assembly segmentation-fault nasm

此代码应输出1位数的密钥长度,但输出段错误。

我无法理解我做错了什么,问题必须在列表的第一部分,因为我直接从书中获取flen函数:

    section .text
    global _start   ;must be declared for linker (ld)
_start:

    mov edi,key
        call flen
        mov ebx,1
        add ecx,38
        mov edx,1
        int 0x80

    flen:           ;length of string on es:edi
    xor eax,eax
    xor ecx,ecx
    dec ecx
    cld
    repne scasb
    neg ecx
    ret


    xor eax,eax
    inc eax
    int 0x80



section .data
key db '123456',0x0
keylen equ $ - key     ;length of our dear string
plaintext times 256 db 1

1 个答案:

答案 0 :(得分:0)

您应该将退出代码移至flen之前。因为在系统调用返回后,您的控制流会再次进入flen。您还应该将系统调用号码放入eax。此外,要打印的值必须在内存中,并且必须传递指针。 0的ascii代码为48而不是38,或者您只能使用'0'。像这样:

    section .text
    global _start   ;must be declared for linker (ld)
_start:

    mov edi,key
        call flen
        add ecx, '0' ; convert to ascii
        push ecx     ; put text onto stack
        mov ecx, esp ; put address into ecx
        mov eax, 4   ; sys_write
        mov ebx,1
        mov edx,1
        int 0x80

    xor eax,eax
    inc eax
    int 0x80

    flen:           ;length of string on es:edi
    xor eax,eax
    xor ecx,ecx
    dec ecx
    cld
    repne scasb
    neg ecx
    ret

section .data
key db '123456',0x0
keylen equ $ - key     ;length of our dear string
plaintext times 256 db 1

请注意,flen返回8。 PS:学习使用调试器。