but will my code work correctly?
the simple answer is no
well - you haven't shown us all the code
but, from what i see, it won't work
push ds
call _sub
@label:
dw 0
dw 0
dw 0
pop dsfor lack of a better term, that's crazy code

i have seen compilers of old pass and/or return data this way
but, to make it work, the first thing your _sub needs to do is to POP the RETurn address off the stack
and - that is the address of the 3 data words
when _sub exits, it has to adjust that address (by 6 in this case) and JMP to the POP DS instruction
that's all well and good, but there are simpler ways to do it
1) define the structure (data type)
2) declare the structure, normally in the data segment
3) pass the address of the structure to the subroutine
there are a few ways to do this
one way is to PUSH the address onto the stack
another way is to simply pass it in a register
4) in the subroutine, access the structure via the passed address
you can read and/or write to the structure members
5) exit the subroutine
if the address was passed on the stack, use RET 2 to "return and pop 2 bytes", discarding the passed address