Как в nasm можно выполнить смещение?
[string + cx]
invalid effective address
дело не в ассемблере, а в устройстве процессора. x86 имеет в 16-битном режиме режим адресации "база + смещение", но базой могут выступать только регистры bx, si, di и bp. При этом
di адресуется относительно сегментного регистра es, а bp адресуется относительно сегментного регистра ss.
Это задокументировано в табличке 2-1 "16-Bit Addressing Forms with the ModR/M Byte" в томе 2А Intel Developer Manual'а, доступного, например,
здесь.