我很难理解为什么在使用.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
的用途是什么?或许我没有正确使用它
请有人点亮!!!!
答案 0 :(得分:1)
movb CharArray, %eax
movb
移动一个字节。 eax
是双字寄存器,您不能使用mov
将字节移动到双字寄存器。使用movzbl
或movsbl
进行零扩展或符号扩展移动,或将目标寄存器更改为%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名称和大小所指出的那样犯了一些愚蠢的错误,并且没有使用$
来获取数组的基地址