Mam pytanie odnośnie asemblera (nasm).
Jak wywołuje program z konsoli "cos.com 123".
Jak dostać się do tej liczby 123 by móc na niej operować ?
O ile mnie pamiec nie myli to bedzie to esp+8(zaczyna sie lista argumentow funkcji) dla 32 bit.
- pewne rozwiazanie:
napisz mini programik w c, a potem uzyj ndisasm czy innego disassemblera.
Bezpośrednio nie możesz się tak odwołać. EntryPoint x86, x64 nie dostaje argumentów - bo niby po co mu to, trzeba sobie samemu sparsować, albo użyć jednej z funkcji bibliotecznych (nazwy z Windowsa): __GetMainArgs, __getmainargs, __wgetmainargs, CommandLineToArgvW.
Pierwsza z nich jest w zabytkowej bibliotece crtdll.dll.
Dwie kolejne są we wszystkich msvcr*.dll.
Ostatnia jest w kernel32.dll.
Druga z nich, __wgetmainargs z msvcrt.dll, pod windowsem 7 wow64 ma jakiś okropnie mocny limit na ilość znaków w pojedynczym argumencie z linii poleceń - o ile pamiętam, to przy 128 znakowym argumencie już obcinało.
;dla x86, trzeba zlinkować z msvcrt.dll; użyty linker: rozbudowany alink
segment .bss
_iwbargc:resd 3
global _entrypoint
segment .text
_entrypoint: ; tu ustawiasz punkt wejścia programu
extern __imp___getmainargs
push _iwbargc+8 ; &newmode
push 0 ; expand=false
push _iwbargc+8 ; &environment
push _iwbargc+4 ; &argv
push _iwbargc ; &argc
call [__imp___getmainargs]
push dword[_iwbargc+8]
push dword[_iwbargc+4]
push dword[_iwbargc]
call main
extern __imp_ExitProcess
push eax
call [__imp_ExitProcess]
; a tutaj masz "main" w znanym stylu z języka C - int __cdecl main(int argc,char* argv[])
main:
mov eax,[esp+4] ; argc - ilość argumentów
mov edx,[esp+8] ; argv - tablica wskaźników
push dword[edx+(0*4)] ; argv[0]
extern __imp_puts
call [__imp_puts] ; puts(argv[0]);
pop eax ; zamiast add esp,4
sub eax,eax ; return 0
ret ; bez parametru, bo main jest cdecl
Oczywiście, nazwy funkcji i sposób ich wywołania zależą od linkera. Prefiksu _imp używamy z dllkami pod Windowsem by uniknąć generowania "jmp" przez linker.
http://forum.codecall.net/topic/55847-cmd-line-arguments-in-dos/ 2 minuty szukania w google