Участник:GeraltFromRivia/Лекция асм 05
Как получить аргументы ком. строки?
- Скомпилиться как си-шная прогррамма, тогда как у любой си-шной проги три аргумента на входе, но будут некие проблемки = ) - исп.фишку под названием msvcrt.dll (runtime, с которой запускается Винда), чтобы ее использовать, надо написать некоторый кусок кода... - - теперь все заменено на -//-80, 90,... - все разобрать ручками. и получить ком. строку как она есть. Однако все надо обрабатывать самим(кавычки и так далее). Хороший пример для практики = )
Как вызывать функции и передавать аргументы мы говорили, но не обсуждали, как создавать лок. переменные. где их выделять?
- размещать переменные в стеке
-> push ebx
... pop ebx ret
- пусть надо выделить на стеке 32 байта, помним, что потом всю память надо потом вернуть
sub esp, 20h push ebx ... mov [esp + 4], ecx ;mov [esp + 4 + 10h], ebx ... pop ebx add esp, 20h ret
alloca - malloc, который не надо освобождать(все автоматически), как он работает, впринципе как sub_esp_*
-> push ebp
move ebp, esp sub esp, 20h ... |mov esp, ebp |pop ebx ret
ebp хранит esp который давался на входе. Мы можем его изменять как хотим, потому как в конце все вернется на круги своя. Что еще интересного можно сказать? комбинация mov+pop(выделено знаком "|") можно заменить функцией leave;(однако две команды быстрее, но leave короче 1 байт против 3х)
Какая у нас адресация в 32х байтном мире(через 16ти битный регистр) фразы ax, bx, cx, ... на экзамене повлекут непотребность...
- далее идет объяснение адресации....многго букафф...
ebp + 4 - адрес возврата ebp + 8 - адрес первого аргумента ebp + c - адрес второго параметра
-> push ebp
mov ebp, esp sub esp, 20h
cmp [eax], 0 - неоднозначность. мы не знаем размер cmp eax, 0 - неоднозначности нет, eax занимает 32 байта
mov esp, ebp pop ebp ret
- чем хорош yasm он выдаст ошибку(поругает вас), а не скомпилирует молча
- даже если не хватает регистров, esp лучке использовать крайне редко, о чем мы потом поговорим отдельно
- однако если написать ТАКОЕ
section .bsc save resd 1
mov [save], esp ... mov esp, [save]
- то можно использовать и стек
Задачка - распарсить строчку типа C:\1.exe param1 "param 2" Win API называется как то так: Get Command Line A/W