Intel Assembler Compute Max
;;; This program prompts for and reads three integers, then prints the ;;; maximim of the three. Demonstrates calling and stack manipulation ;;; including calling two internal functions. global main extern printf extern scanf section .text ;; Read the first two inputs, and push them on the stack. ;; Note: We use a dirty trick (three times!) of moving a value to ;; the stacktop instead of discarding the top, then pushing a value. main: push p1 call req mov [esp],eax ; Replace prompt on stacktop with result push p2 call req mov [esp],eax ; Now, the first two nums are on the stack. ;; Find the larger of the two inputs. Parms already on the stack call max add esp,8 ; Lose the two args push eax ; Put the max there. ;; Ask the other input and get it on the stack push p3 call req mov [esp],eax ; Now the previous max and new number on top. ;; Get the max (in EAX) call max add esp,8 ;; Print the result push eax push mfmt call printf add esp,8 ;; All done ret section .data ;; Three prompts, and the max message. p1: db 'Please enter the first integer',0 p2: db 'How about another one',0 p3: db 'And one more, just for fun',0 mfmt: db 'The largest one is %d.',10,0 section .text ; Return the maximum of two integers. max: mov eax, [esp+4] ; Load first arg cmp eax, [esp+8] ; Compare to the second argument jg noch ; If it's already the max don't change it. mov eax, [esp+8] ; Change it. ; Wrap it up. Leaves the max in eax, which is the return. noch: ret ; Request and return an integer. Argument is a prompt string. req: push ebp ; Set up the frame ptr mov ebp, esp sub esp, 4 ; Make some room for a temp variable ;; Make the prompt. push dword [ebp+8] ; Push argument (string) as arg to printf. push strfmt ; Push the format as arg to printf. call printf add esp,8 ; Remove args from stack. ;; Read the value lea eax,[ebp-4] ; Address of the temp variable on the stack. push eax ; Put it on the stack push rdfmt ; Reading format. call scanf add esp,8 ; Remove from stack. ;; Make the read value the return value mov eax,[ebp-4] ;; Clean up add esp, 4 mov esp, ebp pop ebp ret section .data strfmt: db '%s: ',0 ; Printf format for printing the promt. rdfmt: db '%d',0 ; Scanf format for reading an integer value.