Почему не работает
leaw arrayW, %si
movw (%si), %ax
Потому что ты в 32-битной программе пытаешься адресоваться 16-битным регистром.
Вот так всё прекрасно работает:
leal arrayW, %esi
movw (%esi), %ax
:
$ gcc -m32 -static -nostartfiles load.s -o load
$ gdb ./load
(gdb) b _start
Breakpoint 1 at 0x8049000
(gdb) r
Starting program: /home/jcmvbkbc/tmp/toster/load
Breakpoint 1, 0x08049000 in _start ()
(gdb) si
0x08049006 in _start ()
(gdb)
0x08049009 in _start ()
(gdb) p/x $esi
$1 = 0x804a000
(gdb) p/x $ax
$2 = 0x5