· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.ASSEMBLER —› NASM и LINUX

Посл.отвђт Сообщенiе


Дата: Окт 3, 2004 18:51:57

Я пытаюсь перенести ассемблерную программу из-под Винды в Линукс. До этого с Линуксом не сталкивался. Программа в основном работает с портами вввода/вывода. Использую 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!!!, как и надо.

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


Дата: Окт 3, 2004 19:35:00

Интересно, а разрешено ли пользовательским приложениям писать напрямую в порты, хотябы под виндой. Помойму нет :)


Дата: Окт 3, 2004 19:48:20

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


Дата: Окт 4, 2004 00:51:46

Интересно, а разрешено ли пользовательским приложениям писать напрямую в порты, хотябы под виндой.
Можно только только Винда должна быть 9х


Дата: Окт 4, 2004 03:04:11

Не только 9х

Four-F:
" Самым странным, в вышеприведенном тексте, является обращение к портам ввода-вывода прямо из режима пользователя. Как я уже упомянул выше, доступ к портам ввода-вывода свято охраняется Windows NT. И тем не менее, мы к ним обратились.
..
..
..
Это возможно благодаря карте разрешения ввода-вывода (I/O Permission Map, IOPM)."
>>http://www.wasm.ru/article.php?article=drvw2k03


Дата: Окт 5, 2004 21:40:46

В Linux перед тем как обратится к порту, приложение должно выполнить вызов ioperm(port, num, 1), где port - это адрес порта, num указывает диапазон. Например ioperm(0x170, 8, 1) - для обращения доступны 8 портов, начиная с 0x170, т.е. 0x170-0x177.


Дата: Окт 9, 2004 13:22:51

Спасибо за помощь! Уже всё заработало


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.116