The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

Часто задаваемые вопросы по использованию ассемблера в Unix

21.11.2005 21:13

Aleksey Ulasevich подготовил русскоязычный FAQ по использованию ассемблера в юниксоподобныйх ОС.

  1. Главная ссылка к новости (http://stakanov.nm.ru/as/asm_u...)
Лицензия: CC BY 3.0
Источник: fido7.ru.unix.prog
Короткая ссылка: https://opennet.ru/6478-unix
Ключевые слова: unix, assembler
При перепечатке указание ссылки на opennet.ru обязательно


Обсуждение (28) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, SunTech (?), 22:34, 21/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    аж в ностальгические чувства кинуло...
    спасибо!
     
  • 1.2, Гость (?), 02:24, 22/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    вот такой бы хелп еще по рисковому ассемблеру, а также по переводу х86 на рисковый ) было бы вообще замечательно ))
     
     
  • 2.8, mab (?), 11:10, 22/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    На wasm есть описание ARM ассемблера.
     
     
  • 3.10, Аноним (-), 17:31, 22/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    хотелось бы под PA-RISC =)
     

  • 1.3, злобный лоровский аноним (?), 07:43, 22/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    а там есть вопрос "нафига нужен ассемблер в юниксе"?
     
     
  • 2.5, Otto Katz Feldkurat (?), 10:56, 22/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    .
     
     
  • 3.7, Otto Katz Feldkurat (?), 11:07, 22/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    на выходе как раз ассемблер.
    В который сунуть нос иногда не мешает.
     

  • 1.4, screepah (??), 10:19, 22/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Хорошо. 10nx! :)
     
  • 1.6, Alexey (??), 10:59, 22/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Не поперло - провалился самый первый тестовый пример с выводом стороки "Hello, world!" :(
    Сделал Copy Paste в Ubuntu 5.04 и запустил. Не пишет строку. Strace выдает следующее:

    alexey@ubuntun:~/Trash$ strace -f ./tcall
    execve("./tcall", ["./tcall"], [/* 32 vars */]) = 0
    write(0, NULL, 0)                       = 0
    _exit(0)                                = ?

    Почему то вместо строки передается NULL

     
     
  • 2.11, аноним (?), 03:30, 23/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Первый пример предназначен для FreeBSD, в которой параметры системных вызовов передаются нормальным образом - через стек. В Linux эти параметры передаются через жопу - если их мало, то через регистры, а если много, то через структуру в памяти. Используй код, предназначенный для Linux.
     
     
  • 3.13, _Nick_ (ok), 04:50, 23/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >Первый пример предназначен для FreeBSD, в которой параметры системных вызовов передаются нормальным
    >образом - через стек. В Linux эти параметры передаются через жопу
    >- если их мало, то через регистры, а если много, то
    >через структуру в памяти. Используй код, предназначенный для Linux.

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

     
     
  • 4.14, аноним (?), 07:18, 23/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    В FreeBSD обращение к системным вызовам происходит стандартным, для UNIX, способом, что упрощает переносимость.

    В Linux используются сразу два нестандартных способа - через регистры и, если их не хватает, через структуру в памяти. В первом случае ядру всё равно приходится куда-то переписывать параметры внутри системных вызовов. Ведь регистры, которых не много, нужны для работы, а не для хранения параметров. Во втором случае нужно выделять память под структуру параметров, записывать в ebp её адрес и в конце освобождать эту память. Использование стека упрощает и автоматизирует всё это. Вообще, использование ebp для передачи более пяти параметров появилось только в 2.4.x, как костыль.

    Если бы я не знал, что Linux создавался человеком, до этого использовавшим  Minix, я бы решил, что всё, что он до этого видел, была лишь DOS, в которой именно так всё и работает.

     
     
  • 5.15, Andy (??), 09:05, 23/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    По слухам  Линус просто читать  Posix-стандарт поленился в свое время :-)
     
     
  • 6.20, _Nick_ (ok), 06:25, 24/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    >По слухам  Линус просто читать  Posix-стандарт поленился в свое время
    >:-)
    ага, искал посикс стандарты по всему миру как угорелый, но ленилсо их читать %))))
    ЛОЛ
     
     
  • 7.24, Wulf (?), 11:49, 24/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    > ага, искал посикс стандарты по всему миру как угорелый, но ленилсо их читать %))))
    Студенты, они все такие. Что-либо пытаются читать только за день-два до экзамена. Даже, если имеют конспекты всех лекций.
     
     
  • 8.27, _Nick_ (ok), 22:58, 24/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    афтар, http voffka com archives affftarrr jpg Если ты решил, что POSIX - это п... текст свёрнут, показать
     
     
  • 9.29, Wulf (?), 01:57, 25/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Вот Вам ссылка http www unix org version3 online html - вышлите ее Торвальдсу ... текст свёрнут, показать
     
     
  • 10.30, _Nick_ (ok), 00:22, 26/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    хорошо вам Оперируете современным положением А в средине 90-х сильно было поум... текст свёрнут, показать
     
  • 5.19, Dmitry U. Karpov (?), 00:55, 24/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Лично мне кажется, что способ "регистры и область в памяти" эффективнее. Даже если ядро переписывает данные из регистров куда-то ещё, код для переписывания существует в системе только один раз, а не встречается в каждой программе.

    Да, регистры действительно нужны для работы. Но так ведь передаваемые параметры тут же включаются в работу! Кстати, на RISC-процессорах с их большим числом регистров это очень выгодно.

    Кстати, хочу напомнить, что DOS создавался для работы в очень стеснённых условиях: сначала памяти просто было мало, а потом адресное пространство было ограничено бинароной совместимостью с программами, написанными для реального режима i80*86. Так что ругать какой-то метод только за то, что он использовался в DOS - это всё равно, что ругать военно-тактические приёмы за то, что когда-то они использовались гитлеровцами. Передача параметров через регистры и область в памяти происходила не только в DOS, но и во многих др.операционках того времени.

     
     
  • 6.23, Wulf (?), 11:31, 24/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    > способ "регистры и область в памяти" эффективнее.
    Возможно и верно в случае прямых вызовов подпрограм, обслуживающих syscall. В реальности вызывается сначала обработчик int80h. - для BSD /usr/src/i386/i386/trap.c, в котором происходят проверки на MP_SAFE и глобальных блокировок, вызовы процедур трассировки syscall-ов, различный отладочный код и еще куча всего. И только после всего этого происходит передача управления самому syscall-у. Регистры так или иначе придется сохранять и восстанавливать. Со стеком тут все проще - для передачи параметров достаточно 1-го вызова copyin (копирования области памяти из user-space в kernel)
    > Так что ругать какой-то метод только за то, что он использовался в DOS
    Что использовалось в DOS и других "наколенных" ОС того времени трудно вообще назвать методами. Методами это стало уже в линуксе.
     
     
  • 7.25, аноним (?), 17:56, 24/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    > для BSD /usr/src/i386/i386/trap.c

    У Вас небольшая опечатка, правильно /usr/src/sys/i386/i386/trap.c
    Кстати, есть ли какие-то существенные отличия между вызовами int $0x80 и lcall $7,$0 кроме того, что после lcall $7,$0 нужно делать addl $16,%esp ?

     
     
  • 8.26, Wulf (?), 21:16, 24/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    Я не особо авторитетный человек в этом вопросе, но насколько знаю, для софтверны... текст свёрнут, показать
     

  • 1.9, ws (ok), 12:41, 22/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Под FBSD6.0 проверил все работает...
     
  • 1.12, аноним (?), 03:47, 23/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Теперь надо написать пример простого файлового вируса на ассемблере, который заражает ELF фалы :-))
     
  • 1.17, Wulf (?), 17:23, 23/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Неплохой ресурс по теме, правда BSD-центричный
    http://www.int80h.org/bsdasm/
     
  • 1.22, 4 (?), 09:33, 24/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    а есть вирусы работающие в линукс или бзде?
     
     
  • 2.28, аноним (?), 01:33, 25/11/2005 [^] [^^] [^^^] [ответить]  
  • +/
    есть
     

  • 1.31, Mranton (??), 02:00, 30/11/2005 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    >Aleksey Ulasevich подготовил (http://stakanov.nm.ru/as/asm_unix_faq.html) русскоязычный FAQ по использованию ассемблера в
    >юниксоподобныйх ОС.
    >
    >URL: http://stakanov.nm.ru/as/asm_unix_faq.html
    >Новость: http://www.opennet.dev/opennews/art.shtml?num=6478

    небольшая поправка к статье: в ответе "как слинковать, запустить..." в 4-ом варианте(для Линукс) надо указывать: ld -s hello-nasm.o(было ".asm") -o hello-nasm

     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Партнёры:
    PostgresPro
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2024 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру