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