2

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

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

4

2 回答 2

4

从我在网上可以找到的(12)中,唯一支持的寄存器是:eaxecxedxebxesiediespebp.

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

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

最后,在计算机软件中,表示数字“一”的字符和表示字母“L”的字符之间存在巨大差异。注意你的 1 和 l。我的意思是irmov1vs irmovl

于 2012-07-10T22:34:30.797 回答
0

延斯,

首先,Y86 没有任何 efx、egx 和 ehx 寄存器,这就是为什么在通过 YAS 注入代码时会得到无效行的原因。

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

查看我在http://y86tutoring.wordpress.com上的博客了解详细信息。

于 2012-11-06T22:02:17.850 回答