First: At the assembly code level there is no notion of an "array", it is just bits and bytes to be setup interpreted by you, the developer.
The most straight forward way to achieve an array for your example would be to break up the strings into their own block:
string1: db "abcd"
string2: db "efgh"
string3: db "ijkl"
string4: db "mnop"
string5: db "qrst"
You've now created individual string blocks which can be referenced as a unit individually. The final step would be to declare the "array" through a new data element that contains the starting address of each of the 5 strings:
string_array: dq string1, string2, string3, string4, string5
The above now holds 5 addresses (each occupying 64 bits).
One gets the address of the array into a register somewhere in your code segment. The following is a rather brutal way to go about traversing the array and getting each string itself:
xor rdx, rdx ; Starting at offset zero
lea rdi, [string_array] ; RDI now has the address of the array
mov rsi, [rdi+rdx] ; Get the address of string1
; Process String1
; Get next string
add rdx, 8 ; Get the next offset which is 64 bits
mov rsi, [rdi+rdx] ; Get the address of string2
; Process String2
; etc.
Without knowing what you are doing with the array your code approach may vary.