2013-02-17 73 views
0

我需要編寫一個程序集程序,在-2 < = x < = 8的範圍內查找x^3 -14x^2 + 56x -64的最大值,並且最大值應在其中一個寄存器中該程序。如何將此C for循環轉換爲彙編語言?

我用C編寫了代碼,但是我不知道如何將它自己轉換成Assembly。我現在很困惑。順便說一句,我必須自己轉換它。我無法使用gcc轉換爲程序集。這是用於SPARC

#include<stdio.h> 
int main() 
{ 


int i; 
int ans; 

for (i = -2; i < 9; i++){ 
    ans = (i * i * i) - (14 * i * i) + (56 * i) - 64; 
} 
} 

我試圖編寫程序集。有人可以批評它,並告訴我,如果我在正確的方向。另外,我將如何去測試最大數量?

main: 

    save %sp, -96, %sp 

    ba  test 
    mov -2, %a_r 

loop: 

    mov %a_r, %o0  !a_r moved into o0 
    mov %a_r, %o1  !a_r moved into o1 
    call .mul   !they are multiplied and stored in o0 
    call .mul   !they are multiplied again and stored in o0 
    mov %o0, r0   !results stored in r0 
    mov %a_r, %o0  !a_r moved into o0 and o1 
    mov %a_r, %o1 
    call .mul   !they are multiplied and stored in o0 
    mov 14, %o1   
    call .mul   !o0 result is multiplied by 14 and stored in r1 
    mov %o0, r1 
    mov 56, %o0   !56 moved into o0 
    mov %a_r, %01  !a_r moved into o1 
    call .mul   !they are multiplied and stored in r2 
    mov %o0, r2   
    Sub r0,r1,r0  !r0-r1 stored in r0 
    Add r0,r2,r0  !r0+r2 stored in r0 
    Sub r0,64,r0  !r0-64 stored in r0 
    add %a_r, 1, %a_r !a_r + 1 

test: 
    cmp  %a_r %b_r  ! a_r<=8? 
    ble  loop 
+1

[你有什麼試過?](http://mattgemmell.com/2008/12/08/what-have-you-tried/) – nrz 2013-02-17 00:13:39

+3

'gcc -S prog.c -o prog.s'是一個開始。你可以研究生成的程序集來獲得一些想法。 – nneonneo 2013-02-17 00:14:32

+0

是x86彙編,MIPS,ARM還是什麼? – NeXuS 2013-02-17 00:38:20

回答

1

您的答案缺乏一點細節,因爲我們沒有關於您定位的機器的信息。這聽起來像是功課,所以我不會給你一個完整的答案。

但是我會告訴你的是,爲了在彙編(任何類型)中實現循環,你需要使用標籤和分支指令。

除了它是一個簡單的總結和乘法。請注意將ians存儲在兩個不同的寄存器中(畢竟它們是不同的變量)。

編輯

看來你是在正確的方向(我從來沒有爲SPARC寫的,但在文檔快速瀏覽告訴我,你有正確的想法)。關於最大數量:你將如何在C/C++中使用它?考慮一下,做同樣的程序集! :)