1.2, Гость (?), 02:24, 22/11/2005 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
вот такой бы хелп еще по рисковому ассемблеру, а также по переводу х86 на рисковый ) было бы вообще замечательно )) | |
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 - вышлите ее Торвальдсу ... текст свёрнут, показать | |
|
|
|
|
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.12, аноним (?), 03:47, 23/11/2005 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Теперь надо написать пример простого файлового вируса на ассемблере, который заражает ELF фалы :-)) | |
|