Когда ваша программа запускается, стек выглядит следующим образом
0
Address of last environment string
...
Address of 2nd environment string
Address of 1st environment string
0
Address of last program argument
...
Address of 2nd program argument
Address of 1st program argument
Address of program path
ESP -> Number of arguments
Для вашей задачи вам нужно получить адрес для первого аргумента программы.
Вы найдете его в dword [esp + 8]
.
Сразу после выполнения enter 0,0
и поскольку эта инструкция помещает регистр EBP
, вы найдете его в dword [esp + 12]
== dword [ebp + 12]
.
enter 0,0 ; Same as PUSH EBP : MOV EBP, ESP
mov ebx, dword [ebp + 12] ; Address of first argument
movzx eax, byte [ebx] ; First character, is e.g. "3"
sub al, "0" ; Convert from "3" -> 3
imul eax, 10 ; EAX now holds 3 * 10 == 30
mov dl, byte [ebx + 1] ; Second character, is e.g. "5"
sub dl, "0" ; Convert from "5" -> 5
add al, dl ; EAX now holds 3 * 10 + 5 == 35
call print_int ; Prints "35"