189
правок
Изменения
Новая страница: «Как получить аргументы ком. строки? - Скомпилиться как си-шная прогррамма, тогда как у лю...»
Как получить аргументы ком. строки?
- Скомпилиться как си-шная прогррамма, тогда как у любой си-шной проги три аргумента на входе, но будут некие проблемки = )
- исп.фишку под названием 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
- Скомпилиться как си-шная прогррамма, тогда как у любой си-шной проги три аргумента на входе, но будут некие проблемки = )
- исп.фишку под названием 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