所以,我有一個彙編函數,它在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