在 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
将一个字节移动到双字寄存器。使用 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 , %ebx
movl 0(%eax, %ebx, 4), %edx
movl , 0(%eax, %ebx, 4)
nop
#exit the program
movl , %eax
movl [=10=], %ebx
int [=10=]x80
犯了一些关于注册名称和大小的愚蠢错误,以及没有使用 $
获取数组的基地址
我很难理解为什么在使用 .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
将一个字节移动到双字寄存器。使用 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 , %ebx
movl 0(%eax, %ebx, 4), %edx
movl , 0(%eax, %ebx, 4)
nop
#exit the program
movl , %eax
movl [=10=], %ebx
int [=10=]x80
犯了一些关于注册名称和大小的愚蠢错误,以及没有使用 $
获取数组的基地址