movw %bx, upper_mem(, 1) 无论如何不是 C 术语upper_mem[1] 的挂件。这是一个语法异常,等效于movw %bx, (upper_mem) (https://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory)。
使用关键字 .word 和以下四个值,您在内存中保留了 4 个字(= 8 个字节)的位置,但汇编器不会记住它。寻址保持按字节。第一个 2 字节元素位于 [memory+0],第二个 2 字节元素位于 [memory+2],依此类推。如果你从 [memory+1] 加载一个单词,你会得到第一个元素的一半和第二个元素的一半。类似 C 的索引的一种方法是在您的情况下将索引寄存器缩放(即乘以)2。
希望下面的例子能指出来:
# Name: test.s
# Assemble & link: gcc -m32 test.s
# Run: ./a.out
.global main
.data
upper_mem: .word 0, 0, 0, 0
fmt: .asciz "%d %d %d %d\n"
.text
main:
mov $10, %ax
mov $20, %bx
mov $30, %cx
mov $40, %dx
# https://sourceware.org/binutils/docs/as/i386_002dMemory.html#i386_002dMemory
movl $0, %edi
movw %ax, upper_mem(,%edi,2)
movl $1, %edi
movw %bx, upper_mem(,%edi,2)
movl $2, %edi
movw %cx, upper_mem(,%edi,2)
movl $3, %edi
movw %dx, upper_mem(,%edi,2)
# https://sourceware.org/binutils/docs/as/i386_002dMnemonics.html#i386_002dMnemonics
movzwl (upper_mem), %eax
movzwl (upper_mem+2), %ebx
movzwl (upper_mem+4), %ecx
movzwl (upper_mem+6), %edx
pushl %edx
pushl %ecx
pushl %ebx
pushl %eax
pushl $fmt
call printf
addl $20,%esp
xor %eax, %eax
ret