昨天是情人节,老师休息了一天。
今天的一个课堂作业是:查询eax,ebx,ecx,edx,ebp,esp,esi,edi,eip的功能。
以下是我的整理结果:
数据寄存器(AX、BX、CX、DX):
AX:Accumulator(累加器):累加器可用于乘、除、输入/输出等操作,它们的使用频率很高;
BX:Base Register(基地址寄存器):它可作为存储器指针来使用;
CX:Count Register(计数寄存器):在循环和字符串操作时,要用它来控制循环次数等等;
DX:Data Register(数据寄存器):在进行乘除运算时,它可以作为默认的操作数参与运算等等;
变址寄存器(SI、DI):
寄存器SI和DI称为变址寄存器(Index Register),它们主要用于存放存储单元在段内的偏移量,用它们可以实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便;
指针寄存器(BP、SP):
存储器BP和SP称为指针寄存器,主要用于存放堆栈内存储单元的偏移量,用它们可实现多种存储器操作数的寻址方式,为以不同的地址形式访问存储单元提供方便。指针寄存器不可分割成8位寄存器。它作为通用寄存器,也可以存储算术逻辑运算的操作数和运算结果;
它们主要用于访问堆栈内的存储单元,并且规定:
BP为基指针(Base Pointer)寄存器,用它可以直接存取堆栈中的数据;
SP为堆栈指针(Stack Pointer)寄存器,用它只可访问栈顶;
指令指针寄存器(EIP):
指令指针EIP、IP(Instruction Pointer)是存放下次将要执行的指令在代码段的偏移量。在具有预取指令功能的系统中,下次要执行的指令通常已被预取到指令队列中,除非发生转移情况。所以,在理解它们的功能时,不考虑存在指令队列的情况。
eax, ebx, ecx, edx, esi, edi, ebp, esp等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。
下面是我截取的有关寄存器的概念:
今日作业:作业:
1,输入年份,判断是否式闰年。用函数实现
2,输入年月,输出这一年这一月是多少天。
如: input 2008 2
output 29
input 2019 3
output 31
3.输入年月日,输出是这一年的第几天。
如: input 2008 12 31
output 366
input 2019 3 3
output 62
代码如下:
#include<stdio.h>
bool Is_Leap(int year)
{
if((year % 4 ==0 && year % 100 !=0) || (year % 400==0))
{
return true;
}
else
{
return false;
}
//return (year %4==0 && year %100 !=0) || (year %400==0);
}
int Get_YMD(int year,int month)
{
int days[13]={29,31,28,31,30,31,30,31,31,30,31,30,31};
// 0 1 2 3 4 5 6 7 8 9 10 11 12
if(2 == month && Is_Leap(year))
{
month=0;
}
return days[month];
}
int Get_total(int year,int month,int day)
{
int total=0;
int m=1;
while(m<month)
{
total +=Get_YMD(year,m);
++m;
}
return total + day;
}
int main()
{
int year=0,month=0,day=0;
int total=0;
printf("请输入年份:");
scanf("%d",&year);
printf("请输入月份:");
scanf("%d",&month);
printf("请输入日期:");
scanf("%d",&day);
if(Is_Leap(year))
{
printf("%d 是闰年\n",year);
}
else
{
printf("%d 不是闰年\n",year);
}
printf("%d %d 有%d天\n",year,month,Get_YMD(year,month));
total=Get_total(year,month,day);
printf("%d year %d month %d day是这一年的 %d 天\n",year,month,day,total);
return 0;
}