Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Прочитать аргумент коммандной строки 
:(
    Опции темы
Shaggie
Дата 14.8.2007, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Допустим написал я свою программу и запускаю её из консоли:

./myprogram arg1 arg2

Как мне из-под линукса в ассемблере прочитать эти аргументы с помощью системного вызова write? В винде легко выкручиваюсь вызовом GetCommandLine, в сях читаю argv[], а вот в ассемблере застрял...

Интересен именно системный write, но и другие варианты (если есть) будут приняты с большим интересом.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
Shaggie
Дата 15.8.2007, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Ёлки-палки, только сейчас дошло... не write, а read! Вот это я выдал... И ведь хоть бы кто поправил!

Неужели нет здесь программистов, которым доводилось получать аргументы в линуксе с помощью системных вызовов???


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
MAKCim
Дата 15.8.2007, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Код

.data
.asciz "%s\n"
.text
.globl main
main:
    pushl    %ebp
    movl    %esp, %ebp
    cmpl    $1, 8(%ebp)    /* получаю значение argc и сравниваю с единицей */
    jle    2f
    movl    12(%ebp), %eax    /* получаю значение argv */
1:
    movl    (%eax), %edx
    testl    %edx, %edx
    jz    2f
    pushl    %eax
    pushl    %edx
    pushl   $.data
    call    printf
    addl    $8, %esp
    popl    %eax
    addl    $4, %eax
    jmp    1b
2:
    leave
    xorl    %eax, %eax
    ret


Это сообщение отредактировал(а) MAKCim - 15.8.2007, 16:53


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Shaggie
Дата 20.8.2007, 08:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



MAKCim, спасибо что заставил подумать головой!

Итак, на момент запуска программы в esp находится число равное n аргументов, переданных программе, а в esp+(4*n) - указатель на n-ый аргумент. То есть нет нужды использовать системные вызовы.

Минус один - строка, к примеру, "1234567" хранится в памяти в виде "34333231 00373635", то есть прочитать её с помощью scas не получится, надо писать собственный алгоритм разбора строки. По крайней мере, с ходу я готовых процессорных инструкций для такой ситуации не нашёл...

Но это уже совсем другая история. Большое спасибо, тема закрыта.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
MAKCim
Дата 20.8.2007, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(Shaggie @  20.8.2007,  08:12 Найти цитируемый пост)
Итак, на момент запуска программы в esp находится число равное n аргументов, переданных программе, а в esp+(4*n) - указатель на n-ый аргумент. То есть нет нужды использовать системные вызовы.

нет
в стеке последовательно лежат
ESP: argc
ESP + 4: argv (указатель на аргументы)
ESP + 8: env (указатель на переменные среды)
когда мы делаем
Код

movl    12(%ebp), %eax

мы получаем в EAX адрес первого элемента массива из адресов строк аргументов, переданных в программу
Цитата(Shaggie @  20.8.2007,  08:12 Найти цитируемый пост)
Минус один - строка, к примеру, "1234567" хранится в памяти в виде "34333231 00373635"

опять нет
ты не путай с числом (младший байт по младшему адресу)
"1234567" храниться как 31h 32h 33h 34h 35h 36h 37h


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
Shaggie
Дата 21.8.2007, 10:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Завсегдатай
Сообщений: 570
Регистрация: 21.12.2006
Где: outer space

Репутация: нет
Всего: 72



Цитата(MAKCim @  20.8.2007,  10:16 Найти цитируемый пост)
в стеке последовательно лежат
ESP: argc
ESP + 4: argv (указатель на аргументы)
ESP + 8: env (указатель на переменные среды)

хм-м. У меня было всего около пяти минут, чтобы покопаться в линуксе, так что ничего толком не успел... щас объясню.
Есть программа на ассемблере, совсем простенькая, ничего почти не делает. Единственное что важно - она назывется 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+4esp+8 и esp+12 содержат указатели на... ща посмотрим...

x/x 0xbffff8a8 - 0x6e69772f - странно! Должно быть имя программы... или я ошибаюсь?
x/x 0xbffff8c8 - 0x34333231 - ага, это второй аргумент
x/x 0xbffff8ce - 0x39383736 - а вот и третий!
Или это gdb так аргументы разбрасывает самовольно?

Цитата(MAKCim @  20.8.2007,  10:16 Найти цитируемый пост)
ты не путай с числом (младший байт по младшему адресу)
"1234567" храниться как 31h 32h 33h 34h 35h 36h 37h 

Бес попутал. Внимательно посмотрел, этот момент прояснился.
x/b 0xbffff8c8 - 0x31
Так что я действительно ошибся и других людей в заблужденье ввёл почём зря.

Тема открывается обратно.


--------------------
Цитата(alina3000 @  6.3.2014,  10:47 Найти цитируемый пост)
Сорри что не по теме 
PM MAIL ICQ GTalk Jabber   Вверх
MAKCim
Дата 21.8.2007, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 2
Всего: 207



Цитата(Shaggie @  21.8.2007,  10:44 Найти цитируемый пост)
x/x $esp - показывает 0x00000003.

по ESP должен быть адрес возврата


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для Linux/Unix"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для Linux/Unix | Следующая тема »


 




[ Время генерации скрипта: 0.1316 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.