2012-07-10 261 views
2

我有這個C代碼翻譯成彙編代碼:將C代碼翻譯爲彙編代碼?

#include <stdio.h> 

int main(){ 

int a, b,c; 
scanf("%d",&a); 
scanf("%d",&b); 
if (a == b){ 
    b++; 
} 
if (a > b){ 
    c = a; 
    a = b; 
    b = c;  
} 
printf("%d\n",b-a); 
return 0; 
} 

我的代碼如下,和不完整的。

rdint %eax  # reading a 
    rdint %ebx  # reading b 
    irmovl $1, %edi 

    subl %eax,%ebx 
    addl %ebx, %edi 
    je Equal 


    irmov1 %eax, %efx #flagged as invalid line 
    irmov1 %ebx, %egx 
    irmov1 %ecx, %ehx 
    irmovl $0, %eax 
    irmovl $0, %ebx 
    irmovl $0, %ecx 

    addl %eax, %efx #flagged as invalid line 
    addl %ebx, %egx 
    addl %ecx, %ehx 



    halt 

基本上我認爲它主要是做了,但我有評論旁邊兩行標記爲無效,當我嘗試運行它,但我不知道他們爲什麼是無效的。我也不知道如何做一個> b的陳述。我可以使用任何瞭解y86彙編語言的人的建議。

+3

大多數C編譯器都有一個開關,可以爲你生成程序集:gcc -S,cl/Fa等......至少是你的「x86」彙編程序) – paulsm4 2012-07-10 22:25:38

+0

只是出於好奇,怎麼編譯這個? y86是作業問題的假設語言 – JoeCortopassi 2012-07-10 22:27:42

+0

在我們使用yas progName.c編譯的作業中,然後yis progName.yo – user1261445 2012-07-10 22:33:58

回答

4

從我可以在網上找到(12),唯一支持的寄存器是:eaxecxedxebxesiediespebp

您正在請求不存在的寄存器(efx等)。

另外irmov用於將立即操作數(讀取:常數數值)移入寄存器操作數,而您的irmov1 %eax, %efx有兩個寄存器操作數。

最後,在計算機軟件中,表示數字「1」的字符與表示字母「L」的字符之間存在巨大差異。注意你的1和1。我的意思是irmov1 vs irmovl

+0

這將解釋它...謝謝 – user1261445 2012-07-10 22:37:29

+0

還有更多,請參閱更新。 – 2012-07-10 22:39:06

+0

如果我能做到像irmov1%eax,%efx這樣的東西,那麼我將如何設置我的efx等於eax(因爲我現在給efx一個有效的名稱)......這是我知道如何去做的唯一方法根據我的筆記做這件事。 – user1261445 2012-07-10 22:47:14

0

延,

首先,Y86沒有任何EFX,EGX和EHX寄存器,這就是爲什麼你所得到的無效線路時,你倒過YAS代碼。其次,通過使用subl指令減去兩個寄存器並通過jxx指令跳轉由Y86 ALU設置的條件代碼來製作條件分支。

查看我的博客http://y86tutoring.wordpress.com瞭解詳情。

+0

您的鏈接與此問題的主題無關,並且您未能表明它是您自己的博客。 – 2012-11-08 04:11:39

+0

不相關?那麼,它當然是相關的鏈接。很明顯,海報Jens根本不理解Y86,所以這個鏈接將他引向了一個他可以獲得理解的位置。 – pajacobsen 2012-11-08 14:22:03

+0

關於它是我的博客,是的,我的立場有所改正。其實它是*我們的博客,屬於幾個享受Y86的傢伙。無論如何,我並沒有意識到需要披露,我也糾正了。 – pajacobsen 2012-11-08 14:23:41