2012-07-10 111 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