The result (EAX) resides in the CPU in a format that INTEL calls "integer". You have first to extract the single decimal digits and then store them to an ASCII string which you can display. The usual method is to repeatedly divide the integer by 10 and store the remainder. Google for "assembly convert integer string" and you'll get a lot of exhaustive explanations.
This is your program doing it:
segment .data
msg db "The sum is: "
len equ $-msg
lf db 0x0A
number1 dd 7
number2 dd 3
segment .bss
sum resb 40 ; 40 Bytes for an ASCII string
sum_len resd 1
section .text
global _start
_start:
; Addition
mov eax, [number1]
mov ebx, [number2]
add eax, ebx
; Convert the number to a string
mov edi, sum ; Argument: Address of the target string
call int2str ; Get the digits of EAX and store it as ASCII
sub edi, sum ; EDI (pointer to the terminating NULL) - pointer to sum = length of the string
mov [sum_len], edi
; Output "The sum is: "
mov ecx, msg
mov edx, len
mov ebx, 1
mov eax, 4
int 0x80
; Output sum
mov eax, 4
mov ebx, 1
mov ecx, sum
mov edx, [sum_len]
int 0x80
; Output Linefeed
mov eax, 4
mov ebx, 1
mov ecx, lf
mov edx, 1
int 0x80
; Exit code
mov eax, 1
mov ebx, 0
int 0x80
int2str: ; Converts an positive integer in EAX to a string pointed to by EDI
xor ecx, ecx
mov ebx, 10
.LL1: ; First loop: Save the remainders
xor edx, edx ; Clear EDX for div
div ebx ; EDX:EAX/EBX -> EAX Remainder EDX
push dx ; Save remainder
inc ecx ; Increment push counter
test eax, eax ; Anything left to divide?
jnz .LL1 ; Yes: loop once more
.LL2: ; Second loop: Retrieve the remainders
pop dx ; In DL is the value
or dl, '0' ; To ASCII
mov [edi], dl ; Save it to the string
inc edi ; Increment the pointer to the string
loop .LL2 ; Loop ECX times
mov byte [edi], 0 ; Termination character
ret ; RET: EDI points to the terminating NULL