“.int”vs“.byte”用于在gnu汇编程序上创建数组

时间:2016-09-18 11:11:22

标签: arrays assembly gnu

我很难理解为什么在使用.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

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

我搜索过几十个链接,我只看到人们使用.byte初始化数组。那么.int的用途是什么?或许我没有正确使用它

请有人点亮!!!!

2 个答案:

答案 0 :(得分:1)

   movb CharArray, %eax

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

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

答案 1 :(得分:0)

根据这个问题的提示,这里的评论是最终有效的代码!

.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 $2, %ebx
            movl 0(%eax, %ebx, 4), %edx
            movl $99, 0(%eax, %ebx, 4)
            nop

            #exit the program
            movl $1, %eax
            movl $0, %ebx
            int $0x80

如针对reg名称和大小所指出的那样犯了一些愚蠢的错误,并且没有使用$来获取数组的基地址