/****************************014.c while语句*********************************
* C语言精彩编程百例第14个例子:输入两个正整数,程序输出他们的最大公约数和最小
* 公倍数 */
#include<stdio.h>
void main()
{
int x,y,num1,num2,temp;
printf("请出入两个正整数:\n");
scanf("%d %d",&num1,&num2);
if(num1<num2)
{
temp=num1;
num1=num2;
num2=num1;
}
x=num1;
y=num2;
while(y!=0)
{
temp=x%y;
x=y;
y=temp;
}
printf("他们的最大公约数为%d\n",x);
printf("他们的最小公倍数为%d\n",num1*num2/x);
}
while 语句内对应的汇编代码
L5:
cmpl $0, -8(%ebp) # 比较0 和 y
jne L7 # 如果不等于则跳
jmp L6 # 退出循环
L7:
movl -4(%ebp), %edx # edx =x
movl %edx, %eax # eax =edx
sarl $31, %edx # edx右移31位,没搞懂为什么不是数据直接存入eax 清零edx?
idivl -8(%ebp) # edx:eax/y ; eax存商 ,edx存余数
movl %edx, -20(%ebp) # temp = x%y
movl -8(%ebp), %eax # y = eax
movl %eax, -4(%ebp) # x= eax
movl -20(%ebp), %eax # eax=temp
movl %eax, -8(%ebp) # y=eax
jmp L5 # 下一轮循环
求最大公约数的方法,教材中没有给出详细解释:这个算法叫 辗转相除法, 又名欧几里德算法(Euclidean algorithm)。看了介绍后不难理解。