[asm] Linux sys_open

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by haZard0us, 14 Jan 2009.

  1. haZard0us

    haZard0us Elder - Старейшина

    Joined:
    18 Apr 2006
    Messages:
    26
    Likes Received:
    12
    Reputations:
    5
    Ради интереса разбираюсь с писанием под никсы.
    код на NASM:

    Code:
        global _start
    
        _start:
    
            pop ebx
            pop ebx
            pop ebx ;name of file to write
    
            mov     eax,5   ;sys_open
            mov     ecx,100 ;O_CREAT
            mov     edx,777
            int     0x80    ;call kernel
    
            test    eax,eax ;valid?
            jns     file_func
    
            mov     ebx,eax ;err num
            mov     eax,1   ;sys_exit
            int     0x80
    
            file_func:
            mov     ebx,eax ;sys_open descriptor in eax, fd
            mov     eax,4   ;sys_write
    
            mov     ecx,Msg    ;*buf
            mov     edx,5   ;count
            int     0x80
    
            mov     eax,1
            mov     ebx,0
            int     0x80
    
    section .data
    
            Msg             db      "Hello", 0ah, 0
    
    Непонимаю, что за косяк с созданием файла. Файл создается, но в него не записывает. Когда вместо создания своего пишу в готовый, все ок.
     
  2. __mad

    __mad Elder - Старейшина

    Joined:
    4 Nov 2007
    Messages:
    100
    Likes Received:
    38
    Reputations:
    7
    проблема тут
    mov ecx,100 ;O_CREAT
    mov edx,777

    константы O_CREAT и другие определяются в восьмеричной системе счисления, а у тебя идёт как десятичная, тоже и с правами на файл.
    попробуй заменить на это

    mov ecx,101o ;O_CREAT | O_WRONLY
    mov edx,777o ;

    o, h и b на конце числа означают систему счисления восьмеричная, 16-чная и двоичная соответственно
     
    1 person likes this.
  3. haZard0us

    haZard0us Elder - Старейшина

    Joined:
    18 Apr 2006
    Messages:
    26
    Likes Received:
    12
    Reputations:
    5
    и правда, спс, за наводку, прошляпил =)
    так все ок:
    Code:
            mov     ecx,101
            mov     edx,777q