Участник: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