汇编能够实现显示当前日期,并输出当前日期是这一年中第多少天及第二天的日期。马上要交作业了,求大神!!
汇编能够实现显示当前日期,并输出当前日期是这一年中第多少天及第二天的日期。马上要交作业了,求大神!!
2015-10-13 09:10
程序代码:
#include <stdarg.h>
extern void puts (const char *s); /* 用汇编实现 */
extern void gets (char *s); /* 用汇编实现 */
#define is_white(c) (c == ' ' || c == '\t' || c == '\r' || c == '\n')
#define to_int(c) ('0' <= c && c <= '9' ? c - '0' :\
'a' <= c && c <= 'f' ? c - 'a' + 10 : \
'A' <= c && c <= 'F' ? c - 'A' + 10 : 17)
int vsscanf (const char *buff, const char *fmt, va_list ap)
{
int base = 0, sign = 0;
int c, nr = 0, v;
char *str;
int *int;
while ((c = *fmt++))
{
if (is_white (c))
{
while (is_white (*buff))
++buff;
}
else if (c != '%' || (c = *fmt++) == '%')
{
if (c != *buff++)
break;
}
else if (!*buff || is_white (*buff))
break;
else
switch ((c))
{
case 'c':
str = va_arg (ap, char *);
*str = *buff++;
++nr;
break;
case 's':
str = va_arg (ap, char *);
*str
while (*buff && !is_white(*buff))
*str++ = *buff++;
*str = 0;
++nr;
break;
case 'o':
base = 8;
goto case_int;
case 'd':
base = 10;
goto case_int;
case 'x':
base = 16;
goto case_int;
case_int:
v = sign = 0;
if (*buff == '-')
sign = 1, ++buff;
while ((c = to_int (*buff)) < base)
{
v = v * base + c;
++buff;
}
* va_arg (ap, int *) = sign ? -v : v;
++nr;
break;
}
}
}
int scanf (const char *buff, const char *fmt, ...)
{
int res;
va_list ap;
char buff[512];
gets (buff);
va_start (ap, fmt);
res = vsscanf (buff, fmt, ap);
va_end (ap);
return res;
}
void vsprintf (char *buff, const char *s, va_list ap)
{
int c, n, base = 10, sign = 0;
const char *str = NULL;
char intbuff[65], *pint;
static const char *alphas = "0123456789ABCDEF";
while ((c = *s++))
{
if (c != '%')
*buff++ = c;
else
switch ((c = *s++))
{
case 0:
goto outloop;
case 'c':
*buff++ = va_arg (ap, int);
break;
case '%':
*buff++ = '%';
break;
case 's':
str = va_arg (ap, const char *);
case_str:
while ((*buff++ = *str++));
break;
case 'x':
base = 16;
goto case_int;
case 'o':
base = 8;
goto case_int;
case 'd':
base = 10;
goto case_int;
case_int:
sign = 0;
n = va_arg (ap, int);
if (n < 0)
n = -n, sign = 1;
pint = intbuff + sizeof (intbuff) - 1;
*pint-- = 0;
do *pint-- = alphas [n % base]; while ((n /= base));
if (sign)
*pint-- = 0;
str = pint + 1;
goto case_str;
}
}
*buff++ = 0;
}
void printf(const char *fmt, ...)
{
va_list ap;
char buff[512];
va_start (ap, fmt);
vsprintf (buff, fmt, ap);
va_end (ap);
puts (buff);
}
inline int is_leap (int year)
{
return !(year % 4) && ((year % 25) || !(year % 16));
}
static const int tab_daysofyear_acc[2][13] =
{
{非闰年的天数积累},
{闰年的天数积累},
};
int get_daysofyear_and_nextday(int *pyear, int *pmon, int *pdate)
{
const int *tab = tab [is_leap (year)];
int year = *pyear, mon = *pmon, *date = *pdate, days;
days = tab[mon] + date;
if (++date - 1 > tab[mon+1] - tab[mon])
{
date -= (tab[mon+1] - tab[mon]);
if (++mon > 12)
{
mon -= 12;
year += 1;
}
}
*pyear = year;
*pmon = mon;
*pdate = date;
return days;
}
void do_main_loop (void)
{
int n, y, m, d, days;
while (1)
{
printf ("input date(year month date)>> ");
n = scanf ("%d %d %d", &y, &m, &d);
if (n != 3)
printf ("input error!\n");
else
{
printf ("the %04d-%02d-%02d is ", y, m, d);
days = get_daysofyear_and_nextday (&y, &m, &d);
printf ("%d days in this year.\n"
"next date is: %04d-%02d-%02d \n",
days, y, m, d);
}
}
}
int main(int argc, char **argv)
{
do_main_loop ();
return 0;
}
2015-10-13 11:37
2015-10-13 11:45
2015-10-17 11:43
2015-10-17 17:23
2015-10-19 13:05
程序代码:get_daysofyear_and_nextday:
.LFB1:
pushl %ebp
pushl %edi
xorl %edx, %edx
pushl %esi
pushl %ebx
subl $4, %esp
movl 24(%esp), %eax
movl (%eax), %ecx
movl 28(%esp), %eax
movl (%eax), %ebx
movl 32(%esp), %eax
testb $3, %cl
movl (%eax), %esi
jne .L2
movl %ecx, %eax
movl $1374389535, %edx
imull %edx
movl %ecx, %eax
sarl $31, %eax
sarl $3, %edx
subl %eax, %edx
leal (%edx,%edx,4), %eax
movl $1, %edx
leal (%eax,%eax,4), %eax
cmpl %eax, %ecx
je .L9
.L2:
imull $52, %edx, %edx
leal 0(,%ebx,4), %ebp
movl __tab(%ebp,%edx), %eax
movl __tab+4(%ebp,%edx), %edx
movl %edx, %ebp
leal (%eax,%esi), %edi
subl %eax, %ebp
cmpl %ebp, %esi
movl %edi, (%esp)
leal 1(%esi), %edi
jle .L3
subl %edx, %eax
addl %eax, %edi
leal 1(%ebx), %eax
cmpl $12, %eax
jle .L6
subl $11, %ebx
addl $1, %ecx
.L3:
movl 24(%esp), %eax
movl %ecx, (%eax)
movl 28(%esp), %eax
movl %ebx, (%eax)
movl 32(%esp), %eax
movl %edi, (%eax)
movl (%esp), %eax
addl $4, %esp
popl %ebx
popl %esi
popl %edi
popl %ebp
ret
.L9:
xorl %edx, %edx
testb $15, %cl
sete %dl
jmp .L2
.L6:
movl %eax, %ebx
jmp .L3
.LFE1:
2015-10-21 18:08
2015-12-14 22:21