ASSEMBLER

Все о программировании под *nix
Anonymous

ASSEMBLER

Сообщение Anonymous »

кто нить знает полезные ссылки на доки по ассемблеру... очень хочется свой драйвер написать и управлять своими железками.


Anonymous

Сообщение Anonymous »

пасибо :D

Anonymous

Сообщение Anonymous »

kstati zabil esche odin horoshiy resurs linuxassembly.org ;)

Anonymous

Сообщение Anonymous »

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

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

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

zolak писал(а): Я так понял, что лажа получается из-за моего непонимания Линукса. Может как-то адрес в начале проги прописать надо или что?
Именно в непонимании ;)
Ни одна вменяемая ОС не позволит просто так писать по портам. Как минимум - надо иметь привелегии суперюзверя. Кроме того - ты уверен, что ндао писать по портам? Или дествуешь по принципы "там писал и тут буду" ? Вобщем, читать книженцию linux device driver - есть в гугле, куски русского перевода - в яндексе.
PS: На этом форуме проскакивал подобный вопрос - есть некий грязный хак, позволяющий писать в порты из юзерспейса, но как завется - не знаю..
Опыт растет прямо пропорционально выведенному из строя оборудованию

Anonymous

Сообщение Anonymous »

Llama писал(а):Ни одна вменяемая ОС не позволит просто так писать по портам. Как минимум - надо иметь привелегии суперюзверя. Кроме того - ты уверен, что ндао писать по портам?
Винда позволяет с помощью Ассемблера просто так писать по портам и считывать из них. Для этого-то лучше Ассемблера и не найти. В Винде просто пишешь OUT dx, ax и выводищь всё, что нужно. Элементарно. Без всяких привелегий. Для чего же ещё эти команды в Ассемблере? Вот и в документации на NASM они прописаны.

Аватара пользователя
mend0za
Неотъемлемая часть форума
Сообщения: 2332
Зарегистрирован: 30 авг 2002, 12:33
Откуда: Minsk

Сообщение mend0za »

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

PS: роль ассемблера в unix выполняет язык программирования Си.
И увидел я зверя, выходящего из тундры. И число его было 3.14159265358979324...

Аватара пользователя
Llama
Неотъемлемая часть форума
Сообщения: 9749
Зарегистрирован: 06 фев 2002, 11:40
Откуда: Менск

Сообщение Llama »

zolak писал(а): Винда позволяет с помощью Ассемблера просто так писать по портам и считывать из них. Для этого-то лучше Ассемблера и не найти. В Винде просто пишешь OUT dx, ax и выводищь всё, что нужно. Элементарно. Без всяких привелегий. Для чего же ещё эти команды в Ассемблере? Вот и в документации на NASM они прописаны.
В случае защищенного режима i386 - для написания kernel-space кода и только. Если некая поделка позволяет писать по портам, то мне жаль ее пользователей. Хотя я не верю, что винда просто так позволяет писать всюду. попробуй записать что-нить в порт контроллера IDE от имени пользователя без прав System.
PS: Ессно речь не о системах класса windows 3.0 - windows Me
Опыт растет прямо пропорционально выведенному из строя оборудованию

Аватара пользователя
red f0x
Неотъемлемая часть форума
Сообщения: 338
Зарегистрирован: 08 мар 2004, 01:41

Сообщение red f0x »

только попробуй сделать это в NT и она живо прирежет твоё творение.:twisted: А 9х - это, извините, как то уже не актуально, ИМХО... Защищённый режим был придуман не прикола ради. Если есть ограничения на доступ к IO-портам из юзер-спейса, то может это было сделано небезосновательно? А?
Ну какая работа со строками может быть в языке, название которого является не строкой, а символом? (c) Sergue E. Leontiev

Ответить