Intel Assembler Count Example II
;;; This program reads an integer limit then counts from 1 to the limt. ;;; Uses plain C I/O and must be linked to the C libraries. ;;; This version differs from count.s in that it keeps its data on the stack. global main extern printf extern scanf section .text main: ;; Frame pointer push ebp mov ebp,esp ;; Make space on the stack for the limit (ebp-4) and the ;; loop count (ebp-8) sub esp,8 ;; Issue the prompt using printf. push prompt call printf add esp,4 ;; Read the value using scanf. lea eax, [ebp-4] ; EAX gets the address ebp-4. push eax ; Put it onto the stack push rfmt ; Other args and call. call scanf add esp,8 ;; Init the counter. The modifier dword specifies a 32-bit 1, and ;; is needed here because the assembler cannot otherwise determine ;; the intended size. mov [ebp-8],dword 1 ;; Loop test. Get the counter to eax, then compare to the limit. ltop: mov eax,[ebp-8] ; Counter cmp eax,[ebp-4] ; Limit jg finish ;; Print count. Use count value still in eax. push eax push pfmt call printf add esp,8 ;; Increment the count inc dword [ebp-8] ;; Back to the top jmp ltop ;; Pop the workspace off the stack, fix up frame pointer, leave. finish: add esp,8 mov esp,ebp pop ebp ret section .data prompt: db 'Enter count: ',0 rfmt: db '%d',0 pfmt: db ' => %d',10,0