Hi
I decided to clearify some things.
A dc is just introducing constant, so it is NOT ILLEGAL to use it anywhere, including inside the code, if you can predict what numerical value should be put in the place (I mean you can write whiole program code as dc, if you want and know the values).
Even more - if you use optimizing assembler, and want to ensure that your command won't be changed (for example for sake of code checksum calculations) it can be the only choice to insert opcode as dc.
The thing that you observed is something different - it is the problem of disassembling of code with variable length instructiions. If command can have extension words, you can never be sure if the current word is really new instruction, or extension word of previous. It is something that doesn't exist in PPC, as there every command is always exactly 32-bit wide.
Code and Data sections are used for logical structure of executable. In general, if you want to creatre duplication of the process you have to duplicate the data sections (as these can be written by each process and should be visible only for the process that owns it), but both can share the same code section, as the code is expected not to change during execution). For these reasons constants (like strings for example) are very often attached at the end of code segment by the compilers, as these shouldn't be modified also.
However all of this is not a rule on Amiga, as the system doesn't protect the memory for the owner process only, and you can often see code modifications (like writing pointers to code for jump instructions, while patching libraries...).
However each section (code, data, bss) can have flag to be placed in: FAST-ONLY, CHIP-ONLY, or ANY memory.
And the last thing: BSS sections are just declared and ensured to be filled with zeros, but these are not written explicitly in the code, so doesn't take a space in executable file. Normally, if you write zero in a data section it is written as zero.
Except for one situation: code and data section can be declared to occupy more space than the data they have. This additional data is also initialized to zero. This can be considered as attached BSS to each Data and Code.
Example:
Section data, data
dc.l 1 ; value
ds.l 1 ; declare space, but in the middle, so it is equal to dc.l 0
dc.l 3 ; value
ds.l 1 ; this is declared, but won't take ANY space in the executable, as it will simply extend data section.
I hope I described it clearly enough. If not - let me know.