I started to learn assembly some days ago and i write my first ever piece of code using user input, string functions, passing arguments by stack or by register etc... I have some questions. Do you have some advices to make my code faster. For example, in my atoi function, i know that imul is time consuming. Maybe, there are enormous mistakes but as far as i know, many things to improve for sure. So my main question is : are there fatal errors in this first code and my second is : any type to refactoring code with faster instructions
SYS_READ    equ 3
SYS_WRITE   equ 4
STDIN       equ 0
STDOUT      equ 1
%macro printm 2
    mov eax, SYS_WRITE
    mov ebx, STDOUT
    mov ecx, %1
    mov edx, %2
    int 0x80
%endmacro
%macro prolog 0
    push ebp,
    mov ebp, esp
%endmacro
%macro epilog 0    
    mov esp, ebp
    pop ebp
%endmacro
section .text
global _start
_start:
    ; first check if our strlen proc works
    push dword msgbegin
    call strlen
    add esp, byte 4
    cmp eax, lenbegin
    je .suite       ; it works, we continue
    ; exiting prog if the len computed in rax != lenbegin
    mov eax, 1
    int 0x80
.suite:
    
    ; check if strcpy works printing res (msgbegin -> srcdst)
    push dword lenbegin
    push dword msgbegin
    push dword strdst
    call strcpy
    add esp, byte 12
    
    push dword lenbegin
    push dword strdst
    call print
    add esp, byte 8
    ; first input
    printm msgbinp1, leninp1
    mov eax, SYS_READ
    mov ebx, STDIN
    mov ecx, num1
    mov edx, 2
    int 0x80
    printm msgbinp2, leninp2
    mov eax, SYS_READ
    mov ebx, STDIN
    mov ecx, num2
    mov edx, 2
    int 0x80
    printm msgbinp3, leninp3
    mov eax, SYS_READ
    mov ebx, STDIN
    mov ecx, bignum
    mov edx, 4
    int 0x80
    mov edx, bignum
    call atoi
    cmp eax, 123
    je .success     ; exit if bignum != 123
    mov eax, 1
    int 0x80 
.success:
    ; need to strip line feed from bignum
    printm bignum, 4
    printm msgoutp, lenoutp
    ; now we compute the sum
    mov eax, [num1]
    sub eax, '0'
    mov ebx, [num2]
    sub ebx, '0'
    add eax, ebx
    add eax, '0'
    mov [sum], eax
    printm msgres, lenres
    ; we print it
    printm sum, 1
    ; exiting the programm
    mov     eax, 1
    int     0x80
    
print:
    push ebp
    mov ebp, esp
    mov eax, 4
    mov ebx, 1
    mov ecx, [ebp + 8]
    mov edx, [ebp + 12]
    int 0x80
    mov esp, ebp
    pop ebp
    ret
    
strcpy:
    push ebp
    mov ebp, esp
    mov ecx, [ebp + 16]
    mov esi, [ebp + 12]
    mov edi, [ebp + 8]
    rep movsb
    mov esp, ebp
    pop ebp
    ret
strlen:
    push ebp
    mov ebp, esp
    push edi
    push ecx
    mov edi, [ebp + 8]
    sub ecx, ecx
    sub al, al
    not ecx
    cld
    repne scasb
    not ecx
    lea eax, [ecx] ; keep null term in size
    pop ecx
    pop edi
    mov esp, ebp
    pop ebp
    ret
atoi:
    xor eax, eax            ; zero a "result so far"
.top:
    movzx ecx, byte [edx]   ; get a character
    inc edx                 ; ready for next one
    cmp ecx, '0'            ; valid?
    jb .done
    cmp ecx, '9'
    ja .done
    sub ecx, '0'            ; "convert" character to number
    imul eax, 10            ; multiply "result so far" by ten
    add eax, ecx            ; add in current digit
    jmp .top                ; until done
.done:
    ret    
section .data
    msgbegin db  "hello everyone !", 0xa, 0
    lenbegin equ $ - msgbegin
    msgbinp1 db  "Enter a digit : ", 0xa, 0
    leninp1 equ $ - msgbinp1
    msgbinp2 db  "Enter second digit : ", 0xa, 0
    leninp2 equ $ - msgbinp2
    msgbinp3 db  "Enter third digit : ", 0xa, 0
    leninp3 equ $ - msgbinp3
    msgoutp db  "is equal to 123 !", 0xa, 0
    lenoutp equ $ - msgoutp
    msgres db  "sum of x and y is ", 0xa,  0
    lenres equ $ - msgres
    strdst times lenbegin db 0
segment .bss
    sum     resb 1
    num1    resb 2
    num2    resb 2
    bignum  resd 4 
Thanks you. I started reading the doc but i'm not sure that i understood key concepts.
 
    