чтение из файла

Тема в разделе "WASM.UNIX", создана пользователем ragim, 3 ноя 2010.

  1. ragim

    ragim New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2010
    Сообщения:
    47
    Здравствуйте.
    подскажите пожалуйста почему не читает из файла
    Код (Text):
    1. section .data
    2.        
    3.     fd  dw  0
    4.     path    db  "./rabbit",0
    5. section .bss
    6.     buf resb    3
    7.     necx    resd    1
    8.      
    9. section .text
    10.     global  _start
    11.  
    12. _start:
    13.    
    14.     push    path
    15.     call    open
    16.     mov [fd], ax
    17.     mov ecx, 10
    18. labl:
    19.     mov [necx], ecx
    20.     push    3
    21.     push    buf
    22.     push word [fd]
    23.     call    read
    24.        
    25.     push    buf
    26.     push    3
    27.     call    msg
    28.     mov ecx, [necx]
    29.     loop    labl
    30.    
    31.    
    32.     push     word [fd]
    33.     call    close
    34.     push    0
    35.     call    exit
    36.    
    37.  
    38.    
    39. exit:
    40.     mov eax, 1
    41.     mov ebx, [esp+4]    ;exit code
    42.     int 80h
    43.     ret
    44.  
    45.    
    46. msg:
    47.     mov eax, 4
    48.     mov ebx, 1
    49.     mov ecx, [esp+8]    ;ptr 2 string
    50.     mov edx, [esp+4]    ;nsymbols
    51.     int 80h
    52.     ret
    53.  
    54.  
    55. open:
    56.     mov eax, 5
    57.     mov ecx, 0
    58.     mov edx, 0
    59.     mov ebx, [esp+4]    ;ptr 2 path
    60.     ret
    61.  
    62.  
    63. read:
    64.     mov eax, 3
    65.     mov ebx, [esp+4]    ;fd
    66.     mov ecx, [esp+6]    ;ptr 2 buf
    67.     mov edx, [esp+10]   ;count of bytes
    68.     ret
    69.  
    70.  
    71. close:
    72.     mov eax, 4
    73.     mov ebx, [esp+4]    ;fd
    74.     ret
     
  2. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    Возможно, я тупой, но покажите мне вызов системной функции открытия файла?
    И да, для того, чтобы узнать, почему не происходит чтение, нужно проанализировать значение, возвращаемое функцией чтения.
     
  3. ragim

    ragim New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2010
    Сообщения:
    47
    1)push path
    call open
    2)
    какие hex значения могут возвращать функции при ошибке?
     
  4. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    А int 0x80 для open не забыли?..
     
  5. ragim

    ragim New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2010
    Сообщения:
    47
    извините пжст огромное спасибо
    второй день сижу и не заметил
     
  6. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    С read ещё 2 дня будете сидеть? ;)
     
  7. ragim

    ragim New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2010
    Сообщения:
    47
    нет заметил исправил но не работает
     
  8. ragim

    ragim New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2010
    Сообщения:
    47
    нет заметил исправил но не работает
    поставил int 80h во все процедуры не работает
     
  9. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Ну, блин, gdb в руки и вперёд))
     
  10. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    Что возвращает int80 ? (Второй раз культурно намекаю)
     
  11. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    Ну и вопросики у вас, товарищ. Даже не знаю, что и посоветовать.
    Ну фик его знает, я обычно в МСДНе смотрю, когда дело Виндовс касается. Если ДОС - тоже справочка имеется.
    Ну и для ЮНИКС наверняка должно быть. Откуда то же вы узнали про int 80? Вот там и значения ошибок должны быть. По идее, в регистре eax должны возвращаться.
     
  12. ragim

    ragim New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2010
    Сообщения:
    47
    то что нужно (смотря какая функция) или код ошибки
     
  13. ragim

    ragim New Member

    Публикаций:
    0
    Регистрация:
    8 июл 2010
    Сообщения:
    47
    там смотрел - нету смотрел в сишном мане но там понятно всё в константх которые определены в .h .c файлах которые я затруднился найти
     
  14. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    Блин, ну действительно, не знаю, поискал в гугле - не находится. А, видимо, это связано с тем, что под линукс не очень-то программирование на ассемблере развито.
    Ну не знаю, ищи, где-то же должно быть. Может, кто-то здесь ссылочку подкинет?
    Я с линукс дело не имел, так что не знаю.
    А что вот эта строка значит:
    "./rabbit", 0 ?
    Почему одна точка? Это должно обозначать переход на каталог вверх? Тогда, вроде, две точки должно быть.
    Ну что можно посоветовать. Во-первых, файл для чтения помести в один каталог с твоей программой. Тогда будет "rabbit", 0
    Во-вторых, программировать на ассемблере (да и на любом другом языке, наверное), не зная описания функций - дохлый номер. Ты ж даже не узнаешь, правильно сработал системный вызов или нет.
    Ну, а в третьих, если программа не работает, то сначала нужно определить, в каком месте неправильно. Вот ты задал вопрос - почему не читает. Сначала нужно исключить все возможные ошибки - то, что я с файлом для чтения советовал сделать, определить, открыт ли файл. Ну, в-общем, учись отлаживать программу. Честно говоря, это не тот вопрос, с которым стоит лезть на форум. Здесь ты лучше только узнай, где взять инфу по системным вызовам. Скачай пару книжек по программированию под линукс, что ли. На русском их немного. И разбирайся сам.
    В этой твоей программе сразу несколько ошибок:
    1. Это то, что я про файл говорил.
    2. push path
    call open
    Вместо call open подставь реализацию open. Это избавит тебя от возможных ошибок при работе со стеком. Естествено, при этом строки
    mov eax, 5
    mov ecx, 0
    mov edx, 0
    mov ebx, [esp+4] ;ptr 2 path
    будут несколько другими. Если не понимаешь, почему, тоже не лезь на форум. Разберись лучше сам. Пока будешь вникать, заодно многие другие вещи узнаешь.
    Ну, в-общем, вот таким путём, извини за сумбурность изложения, удачи.
    Если надо, ссылочек на литературу могу накидать.
    А, ну и, конечно, начинать нужно с изучения ассемблера, если, конечно, ты с ним не знаком.
     
  15. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    ragim
    open как сисколл возвращает неотрицательное число (файловый дескриптор) в случае успеха, и отрицательный код ошибки в случае провала. Коды ошибок можно найти в /usr/src/linux/include/asm-generic/errno-base.h. Там они положительные, но это не должно смущать, сисколлы, в случае ошибки делают что-то типа:
    Код (Text):
    1. return -EPERM;
     
  16. r90

    r90 New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2005
    Сообщения:
    898
    Sasha7b9
    . -- это текущая директория. Она необязательна в данном случае, но это не делает путь невалидным.

    Нахрена? Чтобы провоцировать ошибки типа "очепятка"? Чтобы код занимал больше байт? Чтобы потом, когда захочется чтобы open код ошибки клал бы в errno, пришлось бы выискивать в коде все вызовы open?
     
  17. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    Код (Text):
    1. section .text
    2.     global _start
    3.  
    4. _start:
    5.     push        0                  ; O_RDONLY
    6.     push        filename           ;
    7.     call        sys_open
    8.     cmp         eax, -1
    9.     je          @@exit
    10.  
    11.     mov         [fd], eax
    12.  
    13.     push        0x10000
    14.     push        data
    15.     push        dword [fd]
    16.     call        sys_read
    17.     cmp         eax, -1
    18.     je          @@exit
    19.  
    20.     push        eax
    21.     push        data
    22.     push        1
    23.     call        sys_write
    24.  
    25. @@exit:
    26.     call sys_exit
    27.  
    28. ; -------------
    29.  
    30. sys_open:
    31.     mov     eax, 5
    32.     mov     ebx, [esp + 4]
    33.     mov     edx, [esp + 8]
    34.     int     0x80
    35.     ret
    36.  
    37. sys_read:
    38.     mov     eax, 3
    39.     mov     ebx, [esp + 4]
    40.     mov     ecx, [esp + 8]
    41.     mov     edx, [esp + 12]
    42.     int     0x80
    43.     ret
    44.  
    45. sys_write:
    46.     mov     eax, 4
    47.     mov     ebx, [esp + 4]
    48.     mov     ecx, [esp + 8]
    49.     int     0x80
    50.     ret
    51.  
    52. sys_exit:
    53.     mov     eax, 1
    54.     int     0x80
    55.  
    56. section .bss
    57.     data resb (0x10000 + 1)
    58.  
    59. section .data
    60.     fd dd 0
    61.     filename db '/etc/fstab', 0
    Компилировать:
    nasm -f elf readfile.asm
    ld -s -o readfile readfile.o

    Запускать:
    ./readfile
    Или такой вариант с strace:
    strace ./readfile
     
  18. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    r90
    У него используется функция 5 прерывания 80h, если я правильно понял. Ну, может это и одно и то же конечно, я не в курсе.
    Вы случайно не знаете, где найти описание прерывания 80h? Функции там, коды ошибок?
    r90
    Да нет, ну я же написал. Вечно у меня проблемы с выражением мысли) Для отладки, чтобы убедиться, что всё сделано правильно. Потом конечно, оформить в виде функции. Не знаю, я так часто делаю - если не знаю, где ошибка, максимально упрощаю код, чтобы уменьшить число потенциальных проблем.
     
  19. 7mm

    7mm New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2009
    Сообщения:
    442
    INT 0x80 - сервис системных вызовов ядра Linux

    Смотрите тут:
    Код (Text):
    1. arch/x86/kernel/syscall_table_32.S
    2.  
    3. include/asm-generic/errno.h
    4. include/asm-generic/errno-base.h
     
  20. Sasha7b9

    Sasha7b9 New Member

    Публикаций:
    0
    Регистрация:
    17 окт 2010
    Сообщения:
    105
    И тут можно кое-что почерпнуть:
    http://wasm.ru/forum/viewtopic.php?id=12458
    ;)