【发布时间】:2018-10-25 21:17:00
【问题描述】:
完全公开以下代码是为了家庭作业,但我编写的代码我只需要帮助弄清楚为什么我在尝试编译它时会遇到几个错误(我的教授从未谈论过 GCC 错误)。
我写了一个函数,它返回一个大小为 10 的数组的两个最大成员之和。我已经标记了第 70 行和第 74 行:
function1:
pushl %ebp
pushl %ebx
movl $2, %ebx #ebx will be counter
movl %esp, %ebp #first will be %edx and second will be %eax
movl 8(%ebp), %edx #first = arr[0]
movl (%edx,1,4), %eax #second = arr[1] **LINE 70**
cmpl %eax, %edx #if(arr[0] > arr[1]) don't jump
jle .L6
.L7:
movl (8(%ebp),%ebx,4), %ecx #%ecx = next value to compare **LINE 74**
cmpl %ecx, %edx #if first > next don't jump
jle .L8
cmpl %ecx, %eax #if second > next don't jump
jle .L9
cmpl $9, %ebx #check if counter = 9
je .L10
addl $1, %ebx #counter++
jmp .L7
.L6:
movl %edx, %ecx #move arr[0] into %ecx
movl %eax, %edx #first = arr[1]
movl %ecx, %eax #second = arr[0]
jmp .L7
.L8:
movl %edx, %eax #move previous first into second
movl %ecx, %edx #move new first into first
addl $1, %ebx #counter++
jmp .L7
.L9:
movl %ecx, %eax #move new second into second
addl $1, %ebx #counter++
jmp .L7
.L10:
addl %edx, %eax
popl %ebx
popl %ebp
ret
我收到以下错误消息:
assign3.s:70: Error: expecting `)' after scale factor in `(%edx,1,4)'
assign3.s:74: Error: missing ')'
assign3.s:74: Error: missing ')'
assign3.s:74: Error: junk `(%ebp),%ebx,4))' after expression
感谢您的帮助,并告诉我将来如何改进我的问题
【问题讨论】:
-
(%edx,1,4)应该是什么意思?(8(%ebp,%ebx,4))应该是什么意思?你犯了一些语法错误,只有你(作为代码的作者)可以告诉你要写什么。 -
好吧,两者都不是有效的寻址模式。标度/索引/基操作数的形式为
displacement(base, index, scale),其中displacement是常量或符号,base和index是寄存器,scale是1、2、4 或8。1不是寄存器,8(%ebp)不是寄存器,所以你的语法不正确。也许你的意思是4(%edx)用于第一个,8(%ebp, %ebx, 4)用于第二个,但我不太确定。可能您首先需要将8(%ebp)处的值加载到寄存器中,以便将其用作基址寄存器。 -
我给你的建议是,在你编写程序的时候,总是尝试组装和运行你的程序,这样你一出现错误就可以发现它们。您花了很多时间编写了一个长程序,但从未对其进行过测试,现在您可能犯了一些系统性错误,这些错误可能很难修复。如果您在开发过程中一直组装和运行代码,您会更快地发现此类问题。
-
@fuz 另一个建议是遵循语言规则,而不仅仅是编造东西。毕竟,这是计算机编程,而不是诗歌。
-
@Mobyh 创造力在于您的数据结构和算法。语法不承认创造力。解析器对他们接受的内容非常具体。
标签: gcc assembly x86 gnu-assembler