NASM и LINUX

Тема в разделе "WASM.ASSEMBLER", создана пользователем zolak, 3 окт 2004.

  1. zolak

    zolak New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2004
    Сообщения:
    3
    Я пытаюсь перенести ассемблерную программу из-под Винды в Линукс. До этого с Линуксом не сталкивался. Программа в основном работает с портами вввода/вывода. Использую NASM. И сразу возникла такая проблема. Как только пытаюсь записать или считать что-либо с портов с помощью команд OUT или IN, Линукс выдает: Segmentation fault.



    Сначала пытался в большой программе ошибку найти, но потом сделал маленькую тестовую прогу:



    global _start

    _start:

    ;---------------

    mov dx, 0x360

    mov ax, 0x97

    out dx, ax

    ;-------------

    mov eax, 4

    mov ebx, 1

    mov ecx, msg

    mov edx, msglen

    int 0x80

    mov eax, 1

    mov ebx, 0

    int 0x80

    section .data

    msg: db "Hello, world!!!",0x0A,0

    msglen equ $-msg



    Пробовал все варианты вывода и чтения в порты, которые описаны в руководстве NASM:

    ==========================================

    A.111 OUT: Output Data to I/O Port





    OUT imm8,AL ; E6 ib [8086]

    OUT imm8,AX ; o16 E7 ib [8086]

    OUT imm8,EAX ; o32 E7 ib [386]

    OUT DX,AL ; EE [8086]

    OUT DX,AX ; o16 EF [8086]

    OUT DX,EAX ; o32 EF [386]



    OUT writes the contents of the given source register to the specified I/O port. The port number may be specified as an immediate value if it is between 0 and 255, and otherwise must be stored in DX. See also IN

    ===========================================



    Компилятор нормально компилирует при любом варианте, а вот Линукс выдает ошибку тоже при любом. При этом если убрать строку



    out dx, ax



    , то программа выписывает Hello, world!!!, как и надо.



    Я так понял, что лажа получается из-за моего непонимания Линукса. Может как-то адрес в начале проги прописать надо или что?
     
  2. Dr.Golova

    Dr.Golova New Member

    Публикаций:
    0
    Регистрация:
    7 сен 2002
    Сообщения:
    348
    Интересно, а разрешено ли пользовательским приложениям писать напрямую в порты, хотябы под виндой. Помойму нет :)
     
  3. zolak

    zolak New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2004
    Сообщения:
    3
    Под Виндой можно. Моя программа так и работает под Виндой напрямую спортами ввода/вывода с помощью команд IN и OUT. Но вот Линукс отличается, но чем? По-моему, Ассемблер и в особенности команды IN и OUT для того и созданы, чтобы напрямую работать.
     
  4. Fixer

    Fixer New Member

    Публикаций:
    0
    Регистрация:
    14 июл 2003
    Сообщения:
    5
    Адрес:
    Russia
    Интересно, а разрешено ли пользовательским приложениям писать напрямую в порты, хотябы под виндой.

    Можно только только Винда должна быть 9х
     
  5. PavPS

    PavPS New Member

    Публикаций:
    0
    Регистрация:
    24 фев 2004
    Сообщения:
    109
    Адрес:
    Russia
    Не только 9х



    Four-F:

    " Самым странным, в вышеприведенном тексте, является обращение к портам ввода-вывода прямо из режима пользователя. Как я уже упомянул выше, доступ к портам ввода-вывода свято охраняется Windows NT. И тем не менее, мы к ним обратились.

    ..

    ..

    ..

    Это возможно благодаря карте разрешения ввода-вывода (I/O Permission Map, IOPM)."

    >>http://www.wasm.ru/article.php?article=drvw2k03
     
  6. Bob

    Bob New Member

    Публикаций:
    0
    Регистрация:
    2 авг 2004
    Сообщения:
    112
    Адрес:
    Ukraine
    В Linux перед тем как обратится к порту, приложение должно выполнить вызов ioperm(port, num, 1), где port - это адрес порта, num указывает диапазон. Например ioperm(0x170, 8, 1) - для обращения доступны 8 портов, начиная с 0x170, т.е. 0x170-0x177.
     
  7. zolak

    zolak New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2004
    Сообщения:
    3
    Спасибо за помощь! Уже всё заработало