Hi Paul,
Looks like you've run afoul of Nasm's "local label" mechanism...
http://www.nasm.us/doc/nasmdoc3.html#section-3.9In short, by starting your labels, ".T01", etc. with a '.', you've made them "local labels", with a "scope" from the preceeding "regular label" (not really "global" - "file scope") - "byte_zero:" to the next "regular label". Unlike "true local labels", Nasm's "local labels", can be referenced outside of their scope by prepending the preceeding "regular label".
JumpTab: dd byte_zero.T00, byte_zero.T01...
Or, you could lose the '.' throughout - possibly the best solution, in this case. If "namespace pollution" were an issue ("monofile programming" - I don't advocate it, but I do it), you could put JumpTab within "scope" (since it doesn't have to be writable, it could go in .text), pehaps making it a "local variable" itself...
section .text
global byte_zero:function
byte_zero:
mov edx, [esp+4] ; dest
mov ecx, [esp+8] ; count
xor eax, eax ; Set to 0
cmp ecx, 16
ja .F01
jmp [.JumpTab+ecx*4]
.T00:
.T01:
.T02:
.T03:
.T04:
.T05:
.T06:
.T07:
.T08:
.T09:
.T10:
.T11:
.T12:
.T13:
.T14:
.T15:
.T16:
.F01:
ret
.JumpTab: DD .T00, .T01, .T02, .T03, .T04, .T05, .T06, .T07, .T08, .T09, .T10, .T11, .T12, .T13, .T14, .T15, .T16
Nasm will swallow that.
Since a jump through a jump table can't be "predicted", this may be slower than what you've got. Try it and see, I guess...
Best,
Frank