товарищи никсоиды, подскажите плз, как передать в программу аргументы командной строки на асме? что-то типа "main (int argc, char **argv) {}" на си
шо тут сложного к примеру Код (Text): main: pushl %ebp movl %esp, %ebp subl $24, %esp [b]movl 12(%ebp), %eax[/b] [b]addl $4, %eax[/b] <<--- в eax *argv[1] ...
intuit oxid Функция main() вызывается другими процами из библиотеки crt1.o итд... Какой же тогда прикол писать на асме, если использовать libc? Хотя все почти то же... По умолчанию ELF лоадер начинает выполнять наш код с публической метки _start... В это время в стеке мы имеем(начиная с дна)(все двоичные слова): <eip> (вернее какую-то дрянь, при возврате на нее прога вылетает аварийно) <pointer to commandline_arg 1> <pointer to commandline_arg 2> .... <zero> <pointer to environment var 1> <pointer to environment var 2> ..... <zero> Как видно, все уже разложено по полочкам даже аргументы коммандной строки разделены! ) Как всем этим пользоваться?- да очень просто! Для удобства сохраним указатель стека куда-либо(создадим так назыавемый стековый фрейм) Код (Text): public _start _start: push ebp mov ebp,esp ; Теперь адрес нулевого аргумента(т.е. адрес имени самой комманды) коммандной строки лежит в [ebp+8] ; И все! mov eax,[ebp+8] mov bl,[eax] ;теперь в bl лежит первый символ :) ; И так далее... в [ebp+12] лежит адрес следующего аргумента...пока [ebp+xx] не 0....далее в [ebp+(xx+4)] лещит адрес первой env-переменной mov eax,[ebp+24] ;в eax теперь лежит адрес строки "TERM=cons25r" Вот так вот..Все строки нуль-терминированы... Пример: ./bla arg1 arg2 Код (Text): public _start _start: push ebp mov ebp,esp ;печатаем аргументы push dword [ebp+12] call my_printstr push dword [ebp+16] call my_printstr ;печатаем пару env-variables push dword [ebp+24] ;по скольку в [ebp+20] лежит нолик - у нас же два аргумента call my_printstr push dword [ebp+28] call my_printstr ;Выходим push 0 call my_exit ;Восстанавливать esp и ebp не требуется :) В итоге на экране напечаталось: arg1arg2TERM=cons25rTEMP=/tmp Вот и все PS. Пишу свой движок для форума на асме под FreeBSD все приходится делать руками и исследовать саму ось...а сколько еще всего в переди...