Some compilers, including GCC, will sometimes emit switch tables specifying
16-bit .word
displacements to branch targets, and branch instructions
that load entries from that table to compute the target address. If this is
done on a 32-bit machine, there is a chance (at least with really large
functions) that the displacement will not fit in 16 bits. The assembler
handles this using a concept called broken words. This idea is well
named, since there is an implied promise that the 16-bit field will in fact
hold the specified displacement.
If broken word processing is enabled, and a situation like this is encountered,
the assembler will insert a jump instruction into the instruction stream, close
enough to be reached with the 16-bit displacement. This jump instruction will
transfer to the real desired target address. Thus, as long as the .word
value really is used as a displacement to compute an address to jump to, the
net effect will be correct (minus a very small efficiency cost). If
.word
directives with label differences for values are used for other
purposes, however, things may not work properly. For targets which use broken
words, the `-K' option will warn when a broken word is discovered.
The broken word code is turned off by the WORKING_DOT_WORD
macro. It
isn't needed if .word
emits a value large enough to contain an address
(or, more correctly, any possible difference between two addresses).
Go to the first, previous, next, last section, table of contents.