所以,我有一个汇编函数,它在C中调用。它编译并且没有给出警告,但是当我尝试运行它时,它给了我一个分段错误。我认为这是因为我不能将一个常量移动到一个寄存器中,但是使用mul/div命令它需要一个值在EAX寄存器中。 我如何在Assembly中乘两个常量?装配 - 如何在装配中用常数乘以一个常数?
下面的代码到目前为止...
.section .data
.global n
.equ A, 50
.equ B, 5
.section .text
.global loop_function
loop_function:
# prologue
pushl %ebp # save previous stack frame pointer
movl %esp, %ebp # the stack frame pointer for sum function
# beginning
movl i, %ebx # place i (declared in c) in ebx
movl A, %eax # place A in eax
movl B, %ecx # place B in ecx
jmp loop
loop:
movl $0, %edx # clean edx register
cdq
idivl %ecx # A/B, result in eax
imull %ebx # i * A/B, result in eax
incl %ebx
cmpl %ebx, n # if i <= n
jle loop # then jumps to loop
jmp end # else jumps to end
end:
# epilogue
movl %ebp, %esp # restore the previous stack pointer ("clear" the stack)
popl %ebp # restore the previous stack frame pointer
ret
真正的答案是在[Application_binary_interface](https://en.wikipedia.org/ wiki/Application_binary_interface)(ABI)。如果您没有ABI,那么我建议您将每个使用的寄存器推入堆栈,并在返回之前将其弹出。 – user3386109
错误的可能原因是您没有遵循标准调用约定。特别是,你销毁了'ebx'这是一个被保存的被保存的寄存器,所以你的调用者可能会希望它没有改变。 – Jester
A和B似乎是常量,我猜测我是一个变量,但是对所有变量使用完全相同的语法。我认为它试图从内存地址50和地址5加载值,这不会起作用。我建议使用$ A和$ B。 – prl