Arrays &引用;。int";vs";。字节";用于在GNU汇编程序上创建数组

Arrays &引用;。int";vs";。字节";用于在GNU汇编程序上创建数组,arrays,assembly,gnu-assembler,att,Arrays,Assembly,Gnu Assembler,Att,我不明白为什么在使用.int初始化整数数组后,使用movl无法工作,而使用.byte则可以完美地工作 另外,我使用AT&T语法只是为了从一开始就清楚 代码如下: .data IntArray: .int 1, 2 CharArray: .byte 1,2 .text .globl _start _start: movl IntArray, %eax <--- fails

我不明白为什么在使用
.int
初始化整数数组后,使用
movl
无法工作,而使用
.byte
则可以完美地工作

另外,我使用AT&T语法只是为了从一开始就清楚

代码如下:

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

.text

    .globl _start

    _start:
            movl IntArray, %eax <--- fails
            movb CharArray, %eax <-- works
.data
IntArray:
.int 1,2
查拉雷:
.字节1,2
文本
.globl_启动
_开始:
移动未阵列,%eax
movb
移动一个字节
eax
是双字寄存器,不能使用
mov
将字节移动到双字寄存器。使用
movzbl
movsbl
执行零扩展或符号扩展移动,或将目标寄存器更改为字节寄存器,如
%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 $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

在注册表名和大小方面犯了一些愚蠢的错误,并且没有使用
$
获取数组的基址

您使用什么汇编程序?因为这看起来不像是在使用GNU汇编程序。很抱歉,我删除了一些遗漏的不可打印字符。我强迫我的vim打印它们,因为我在过去的某个时候遇到了一个棘手的问题。我直接从vim编辑器中复制(虽然删除了它们,但显然有一些被遗漏了:()是的,GNU汇编程序非常混乱,因为布局非常奇怪。通常标签位于第一列,指令(如
。数据
文本
)与助记符位于同一列(即第二栏)。您的布局令人困惑。啊!现在您更改了问题!请始终发布导致错误的代码,而不是您编造的代码。此外,始终发布您收到的错误消息,否则很难找出“…失败”的原因意思是。请注意,您的代码没有复制
IntArray
CharArray
的基址,而是在基址处复制了一些字节。您确定这就是您想要的吗?如果您确实要复制基址,请编写
movl$IntArray,%eax
movl$CharArray,%eax
。这显然不是为您准备的y!!!!尽管如此,它现在仍在工作。谢谢这甚至没有回答问题。
movb,%eax
也会失败,即使
movb(%eax,%ebx,1),%eax
除了汇编器发出警告消息将eax替换为al之外,它的组装和链接没有任何问题。关键是这个答案没有解释movb CharArray,%eax
和这个“答案”到底出了什么问题根本不使用CharArray。我很高兴你的问题解决了,把你的工作版本作为答案发布通常是件好事,但我不确定这是否会帮助其他有同样问题的人。(如果他们也阅读所有其他评论等,也许会有帮助,但答案应该是独立的)。
.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