我必须将此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汇编语言的人的建议。
答案 0 :(得分:4)
根据我在网上找到的内容(1,2),唯一支持的寄存器是:eax
,ecx
,edx
,{{1 },ebx
,esi
,edi
和esp
。
您正在请求不存在的寄存器(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了解详情。