Я пытаюсь перенести ассемблерную программу из-под Винды в Линукс. До этого с Линуксом не сталкивался. Программа в основном работает с портами вввода/вывода. Использую 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!!!, как и надо. Я так понял, что лажа получается из-за моего непонимания Линукса. Может как-то адрес в начале проги прописать надо или что?
Интересно, а разрешено ли пользовательским приложениям писать напрямую в порты, хотябы под виндой. Помойму нет
Под Виндой можно. Моя программа так и работает под Виндой напрямую спортами ввода/вывода с помощью команд IN и OUT. Но вот Линукс отличается, но чем? По-моему, Ассемблер и в особенности команды IN и OUT для того и созданы, чтобы напрямую работать.
Интересно, а разрешено ли пользовательским приложениям писать напрямую в порты, хотябы под виндой. Можно только только Винда должна быть 9х
Не только 9х Four-F: " Самым странным, в вышеприведенном тексте, является обращение к портам ввода-вывода прямо из режима пользователя. Как я уже упомянул выше, доступ к портам ввода-вывода свято охраняется Windows NT. И тем не менее, мы к ним обратились. .. .. .. Это возможно благодаря карте разрешения ввода-вывода (I/O Permission Map, IOPM)." >>http://www.wasm.ru/article.php?article=drvw2k03
В Linux перед тем как обратится к порту, приложение должно выполнить вызов ioperm(port, num, 1), где port - это адрес порта, num указывает диапазон. Например ioperm(0x170, 8, 1) - для обращения доступны 8 портов, начиная с 0x170, т.е. 0x170-0x177.