在 GNU 汇编器上创建数组的“.int”与“.byte”

".int" vs ".byte" for creating an array on GNU assembler

我很难理解为什么在使用 .int 初始化整数数组后不适用于 movl 但是使用 .byte 可以完美地工作。

P.S。我使用 AT&T 语法只是为了从一开始就清楚

代码如下:

.data
    IntArray:
        .int 1, 2
    
    CharArray:
        .byte 1,2

.text

    .globl _start

    _start:
            movl IntArray, %eax <--- fails
            movb CharArray, %eax <-- works

顺便说一下,这是将基地址复制到寄存器中的 'right' 方法,因为它复制的是第一个字节,而不是我想要的地址。

我搜索了数十个链接,但只看到有人使用 .byte 初始化数组。那么.int有什么用呢?也可能是我没用好。

   movb CharArray, %eax

movb 移动一个字节。 eax 是一个双字寄存器,不能用 mov 将一个字节移动到双字寄存器。使用 movzblmovsbl 进行零扩展或符号扩展移动,或将目标寄存器更改为字节寄存器,如 %al.

这是我看到您的代码中唯一的错误。不知道您为什么认为 .int 有问题。

根据这个问题的提示和这里的评论,代码终于可以运行了!

.data
    IntArray:
        .int 11, 22, 33, 44, 55

    CharArray:
        .byte 55, 2, 3, 4

.bss
    .comm BufferSpace, 1000

.text

    .globl _start

    _start:
            movl $IntArray, %eax
            movl , %ebx
            movl 0(%eax, %ebx, 4), %edx
            movl , 0(%eax, %ebx, 4)
            nop

            #exit the program
            movl , %eax
            movl [=10=], %ebx
            int [=10=]x80

犯了一些关于注册名称和大小的愚蠢错误,以及没有使用 $ 获取数组的基地址