How to use scanf in NASM?

assembly, nasm

Solution

I found this 'Programming in NASM.PDF'

; add1.asm
SECTION .data
    message1: db "Enter the first number: ", 0
    message2: db "Enter the second number: ", 0
    formatin: db "%d", 0
    formatout: db "%d", 10, 0 ; newline, nul terminator
    integer1: times 4 db 0 ; 32-bits integer = 4 bytes
    integer2: times 4 db 0 ;
SECTION .text
   global _main 
   extern _scanf 
   extern _printf     

_main:

   push ebx ; save registers
   push ecx
   push message1
   call printf

   add esp, 4 ; remove parameters
   push integer1 ; address of integer1 (second parameter)
   push formatin ; arguments are right to left (first parameter)
   call scanf

   add esp, 8 ; remove parameters
   push message2
   call printf

   add esp, 4 ; remove parameters
   push integer2 ; address of integer2
   push formatin ; arguments are right to left
   call scanf

   add esp, 8 ; remove parameters

   mov ebx, dword [integer1]
   mov ecx, dword [integer2]
   add ebx, ecx ; add the values          ; the addition
   push ebx
   push formatout
   call printf                            ; call printf to display the sum
   add esp, 8                             ; remove parameters
   pop ecx
   pop ebx ; restore registers in reverse order
   mov eax, 0 ; no error
   ret

Which is the asm version of this C function:

#include <stdio.h>
int main(int argc, char *argv[])
{
    int integer1, integer2;
    printf("Enter the first number: ");
    scanf("%d", &integer1);
    printf("Enter the second number: ");
    scanf("%d", &integer2);
    printf("%d\n", integer1+integer2);
    return 0;
}

Problem

I'm trying to figure out how to use `scanf` to get user input. I know to use `printf`: all I have to do is push the data I want to write on the screen into the stack like this: ``` global _main extern _printf extern _scanf section .data msg db "Hi", 0 section .text _main: push ebp mov ebp, esp push msg call _printf mov esp, ebp pop ebp ret ``` But I can't figure out how to use `scanf`. Can someone please just give me the simplest possible source code you can for `scanf`? I really just want to put what the user types in. I'm not used to 32bit Assembly. I've only ever used 16bit, and I know in 16bit (DOS) you can just do this: ``` mov ah, 3fh mov dx, input int 21h input rb 100d ``` And whatever you type in will the placed at the address of "input."

Original source

Related problems