|
|
|
Shaggie |
|
|||
Опытный Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
Допустим написал я свою программу и запускаю её из консоли:
./myprogram arg1 arg2 Как мне из-под линукса в ассемблере прочитать эти аргументы с помощью системного вызова write? В винде легко выкручиваюсь вызовом GetCommandLine, в сях читаю argv[], а вот в ассемблере застрял... Интересен именно системный write, но и другие варианты (если есть) будут приняты с большим интересом. |
|||
|
||||
Shaggie |
|
|||
Опытный Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
Ёлки-палки, только сейчас дошло... не write, а read! Вот это я выдал... И ведь хоть бы кто поправил!
Неужели нет здесь программистов, которым доводилось получать аргументы в линуксе с помощью системных вызовов??? |
|||
|
||||
MAKCim |
|
|||
Воін дZэна Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
Это сообщение отредактировал(а) MAKCim - 15.8.2007, 16:53 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Shaggie |
|
|||
Опытный Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
MAKCim, спасибо что заставил подумать головой!
Итак, на момент запуска программы в esp находится число равное n аргументов, переданных программе, а в esp+(4*n) - указатель на n-ый аргумент. То есть нет нужды использовать системные вызовы. Минус один - строка, к примеру, "1234567" хранится в памяти в виде "34333231 00373635", то есть прочитать её с помощью scas не получится, надо писать собственный алгоритм разбора строки. По крайней мере, с ходу я готовых процессорных инструкций для такой ситуации не нашёл... Но это уже совсем другая история. Большое спасибо, тема закрыта. |
|||
|
||||
MAKCim |
|
||||
Воін дZэна Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
нет в стеке последовательно лежат ESP: argc ESP + 4: argv (указатель на аргументы) ESP + 8: env (указатель на переменные среды) когда мы делаем
мы получаем в EAX адрес первого элемента массива из адресов строк аргументов, переданных в программу
опять нет ты не путай с числом (младший байт по младшему адресу) "1234567" храниться как 31h 32h 33h 34h 35h 36h 37h -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
||||
|
|||||
Shaggie |
|
||||
Опытный Профиль Группа: Завсегдатай Сообщений: 570 Регистрация: 21.12.2006 Где: outer space Репутация: нет Всего: 72 |
хм-м. У меня было всего около пяти минут, чтобы покопаться в линуксе, так что ничего толком не успел... щас объясню. Есть программа на ассемблере, совсем простенькая, ничего почти не делает. Единственное что важно - она назывется abcde. Смотрю в отладчике вот так: gdb -q --args abcde 12345 67890 tb _start x/x $esp - показывает 0x00000003. Это я так понимаю три аргумента, первый - название программы, второй и третий - мои строки. x/x $esp+4 - 0xbffff8a8 x/x $esp+8 - 0xbffff8c8 x/x $esp+12 - 0xbffff8ce x/x $esp+16 - 0x00000000 То есть esp+4, esp+8 и esp+12 содержат указатели на... ща посмотрим... x/x 0xbffff8a8 - 0x6e69772f - странно! Должно быть имя программы... или я ошибаюсь? x/x 0xbffff8c8 - 0x34333231 - ага, это второй аргумент x/x 0xbffff8ce - 0x39383736 - а вот и третий! Или это gdb так аргументы разбрасывает самовольно?
Бес попутал. Внимательно посмотрел, этот момент прояснился. x/b 0xbffff8c8 - 0x31 Так что я действительно ошибся и других людей в заблужденье ввёл почём зря. Тема открывается обратно. |
||||
|
|||||
MAKCim |
|
|||
Воін дZэна Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 2 Всего: 207 |
по ESP должен быть адрес возврата -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
Правила форума "Asm для Linux/Unix" | |
|
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Asm для Linux/Unix | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |