将C代码转换为汇编代码?

时间:2012-07-10 22:21:40

标签: c assembly y86

我必须将此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

基本上我认为它大部分都已完成,但是当我尝试运行它时,我在两行标记为无效的旁边进行了评论,但我不确定它们为什么无效。我也不确定如何为&gt;做一个if语句。湾我可以使用任何了解y86汇编语言的人的建议。

2 个答案:

答案 0 :(得分:4)

根据我在网上找到的内容(12),唯一支持的寄存器是:eaxecxedx,{{1 },ebxesiediesp

您正在请求不存在的寄存器(ebp以及更远)。

同样efx用于将立即数操作数(读取:常量数值)移动到寄存器操作数中,而irmov有两个寄存器操作数。

最后,在计算机软件中,表示数字“一”的字符和表示字母“L”的字符之间存在巨大差异。记住你的1和l。我的意思是irmov1 %eax, %efx vs irmov1

答案 1 :(得分:0)

延,

首先,Y86没有任何efx,egx和ehx寄存器,这就是当你通过YAS注入代码时获得无效行的原因。

其次,通过使用subl指令减去两个寄存器并通过jxx指令跳转Y86 ALU设置的条件代码来创建条件分支。

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