5 Ìá¸ßÔËÐÐËÙ¶È£¨harib12e£© ¡¡ 295
struct FIFO32 fifo;
struct TIMER *timer_ts, *timer_put; int i, fifobuf[128], count = 0; char s[12];
fifo32_init(&fifo, 128, fifobuf); timer_ts = timer_alloc();
timer_init(timer_ts, &fifo, 2); timer_settime(timer_ts, 2); timer_put = timer_alloc();
timer_init(timer_put, &fifo, 1); timer_settime(timer_put, 1);
1 2 3 4
for (;;) { count++; io_cli();
if (fifo32_status(&fifo) == 0) { io_sti(); } else {
i = fifo32_get(&fifo); io_sti(); if (i == 1) {
sprintf(s, \
putfonts8_asc_sht(sht_back, 0, 144, COL8_FFFFFF, COL8_008484, s, 11); timer_settime(timer_put, 1); } else if (i == 2) { farjmp(0, 3 * 8);
timer_settime(timer_ts, 2); } } }
5 6 7 8 9
}
10 11 12 13 14 14 15
»ù±¾ÉϾÍÊÇÕâ¸öÑù×Ó¡£¶ÔÁË£¬´úÂ뿪ͷµÄsht_backÎÒÃǸÄΪ×÷Ϊº¯ÊýµÄ²ÎÊýÀ´´«µÝÁË£¬¹ØÓÚ ÕâÒ»µãÎÒÃÇÒÔºó»á½²µ½£¬´ó¼Ò²»±Øµ£ÐÄ¡£
ÁíÍ⣬ÉÏÃæµÄ´úÂ뻹°ÑÈÎÎñÇл»¼ÆÊ±Æ÷³¬Ê±µÄʱºòÏòFIFOдÈëµÄÖµ¸ÄΪÁË2¡£Æäʵ²»¸ÄҲû ʲôÎÊÌ⣬ֻ²»¹ýÒòΪÕâ¸ö¼ÆÊ±Æ÷¶¨ÁË0.02ÃëÕâ¸öÊý£¬ËùÒÔ¾Í˳ÊָijÉ2ÁË¡£
»¹ÓУ¬countÊýÖµµÄÏÔʾ¸ñʽ¸Ä³ÉÁË11λÊý×Ö£¬ÒòΪÔËÐÐËٶȱä¿ìÁ˵ϰ£¬Ëµ²»¶¨Êý×ÖλÊý »á²»¹»ÓÃÄØ£¨Ð¦£©¡£
¡ö¡ö¡ö¡ö¡ö
¹ØÓÚ½«sht_backµÄÖµ´ÓHariMain´«µÝ¹ýÀ´µÄ·½·¨£¬*((int *) 0x0fec)ÕâÑùµÄд·¨¸Ð¾õʵÔÚÊDz»ºÃ ¿´£¬ÓÚÊǹû¶Ï·ÏÆúÁË£¬ÎÒÃÇÓÃÕ»À´Ìæ´úËü¡£
¾Ù¸öÀý×Ó£¬load_tr(123);ÕâÑùµÄº¯Êýµ÷Óã¬Èç¹û´Ó»ã±àÓïÑԵĽǶÈÀ´¿¼Âǵϰ£¬²ÎÊýÖ¸¶¨µÄ ÊýÖµ£¨123£©¾Í·ÅÔÚÄÚ´æÖУ¬µØÖ·ÎªESP+4£¬ÕâÊÇCÓïÑÔµÄÒ»¸ö¼È¶¨»úÖÆ¡£
296 ¡¡ µÚ 15 Ì죺¶àÈÎÎñ£¨1£©
¼ÈÈ»ÓÐÕâÖÖ»úÖÆ£¬ÄÇôÎÒÃÇ¿ÉÒÔ·´¹ýÀ´ÀûÓÃһϣ¬Ò²¾ÍÊÇ˵£¬ÔÚHariMainÀïÃæÕâÑùд£º ±¾´ÎµÄHariMain½ÚÑ¡
task_b_esp = memman_alloc_4k(memman, 64 * 1024) + 64 * 1024 - 8; *((int *) (task_b_esp + 4)) = (int) sht_back;
ÕâÑùÒ»À´£¬ÔÚÈÎÎñBÆô¶¯µÄʱºò£¬[ESP+4]Õâ¸öµØÖ·ÀïÃæ¾ÍÒѾ´æÈëÁËsht_backµÄÖµ£¬Òò´ËÎÒ ÃÇ¾ÍÆÛÆÁËtask_b_main£¬ÈÃËüÒÔΪ×Ô¼ºËù½ÓÊÕµ½µÄsht_backÊÇ×÷Ϊһ¸ö²ÎÊý´«µÝ¹ýÀ´µÄ¡£ ¿ÉÄÜÓÐÈ˲»Ã÷°×ΪʲôÎÒÃÇÒª°Ñtask_b_espµÄµØÖ·¼õ8£¬¼õ4²»¾Í¿ÉÒÔÁËÂð£¿ÎÒÃǵ±È»²»Äܼõ 4£¬Ö»Òª×Ðϸ˼¿¼Ò»Ï¾ÍÄܸãÇå³þÕâÀïµÄ°ÂÃî¡£
¼ÙÉèmemman_alloc_4k·ÖÅä³öÀ´µÄÄÚ´æµØÖ·Îª0x01234000£¬ÓÉÓÚÎÒÃÇÉêÇë·ÖÅäÁË64KBµÄÄÚ´æ ¿Õ¼ä£¬ÄÇôÎÒÃÇ¿ÉÒÔ×ÔÓÉʹÓõÄÄÚ´æµØÖ·¾ÍÊÇ´Ó0x01234000µ½0x01243fffΪֹµÄÕâÒ»¿é¡£Èç¹ûÔÚ ÕâÀïÎÒÃǼȲ»¼õ4Ò²²»¼õ8£¬¶øÊÇÖ±½Ó¼ÓÉÏ64 * 1024µÄ»°£¬task_b_esp¼´Îª0x01244000¡£Èç¹ûÎÒÃÇ ¼õÈ¥4£¬task_b_esp¼´Îª0x01243ffc£¬µ«ÎÒÃÇдÈësht_backµÄµØÖ·ÊÇtask_b_esp + 4£¬ËãÏÂÀ´¾Í±ä³ÉÁË 0x01244000£¬Èç¹û°Ñ4×Ö½ÚµÄsht_backֵдÈëÕâ¸öµØÖ·µÄ»°£¬¾Í³¬³öÁË·ÖÅ䏸ÎÒÃǵÄÄڴ淶Χ £¨0x01234000¡«0x01243fff£©£¬ÕâÑù²»ÐС£
¶øÈç¹ûÎÒÃǼõÈ¥8£¬task_b_esp¼´Îª0x01243ff8£¬Ð´Èësht_backµÄµØÖ·ÊÇtask_b_esp + 4£¬¼´
0x01243ffc£¬´ÓÕâ¸öµØÖ·ÏòºóдÈë4×Ö½ÚµÄsht_backÖµ£¬ÔòÕýºÃÔÚ·ÖÅä³öÀ´µÄÄڴ淶Χ£¨0x01234000 ¡«0x01243fff£©ÄÚÍê³É²Ù×÷£¬ÕâÑù¾Í²»»á³öÎÊÌâÁË¡£
¡ö¡ö¡ö¡ö¡ö
ºÃ£¬ÎÒÃÇÀ´ÔËÐÐһϣ¬¿´¿´ÊDz»ÊDZä¿ìÁË£¿»¹ÓУ¬task_b_mainÓÐûÓб»ÎÒÃÇÆÛÆ¶øË³Àû½ÓÊÕ µ½sht_backµÄֵĨ£¿Èç¹ûÕâÒ»Õв»³É¹¦µÄ»°£¬sht_backµÄÖµ¾Í»á³öÏÖÒì³££¬»ÃæÉÏÒ²¾ÍÓ¦¸ÃÏÔʾ²» ³öÊý×ÖÁË¡£¨Dmake run¡¬£¬ÍÛ£¬³É¹¦ÁË£¬¶øÇÒËٶȷɿ죨Çë×¢Ò⣬ÓÒͼÏÔʾµÄÊdzÌÐò»¹Ã»ÓÐÔËÐе½ 10ÃëµÄ״̬£¬Õâʱ¾ÍÒѾÊýµ½Õâô´óµÄÊý×ÖÁË£¡¡££©
¼´±ãÊÇÄ£ÄâÆ÷»·¾³ÏÂÔËÐÐËÙ¶ÈÒ²ÒѾÏ൱¿ìÁË
6 ²âÊÔÔËÐÐËÙ¶È£¨harib12f£© ¡¡ 297
COLUMN-9 ǧÍò²»ÄÜ return£¿
1 2 3 4 5 6 7 8 9
ÔÚÕâÒ»½ÚÖУ¬task_b_main ÒѾ±äµÃÏñÒ»¸öÆÕͨº¯ÊýÒ»ÑùÁË£¬µ«ÊÇÔÚÕâ¸öº¯ÊýÖÐǧÍò²» ÄÜʹÓà return¡£
return µÄ¹¦ÄÜ£¬Ëµµ½µ×ÆäʵÊÇ·µ»Øº¯Êý±»µ÷ÓÃλÖõÄÒ»¸ö JMP Ö¸Áµ«Õâ¸ö task_b_main ²¢²»ÊÇÓÉij¶Î³ÌÐòÖ±½Óµ÷Óõģ¬Òò´Ë²»ÄÜʹÓà return¡£Èç¹ûÇ¿ÐÐ return µÄ»°£¬¾Í»áÏñ¨DÖ´ÐÐ Êý¾Ý¡¬Ò»Ñù·¢ÉúÎÊÌ⣬³ÌÐòÎÞ·¨Õý³£ÔËÐС£
HariMain µÄÇé¿öÒ²ÊÇÒ»ÑùµÄ£¬Ò²½ûֹʹÓà return¡£
ÎÒÃÇÔÚ 15.1 ½ÚÖн²¹ý£¬ÎªÁ˼ÇסÏÖÔÚÕýÔÚÖ´ÐеÄÖ¸ÁîËùÔÚµÄÄÚ´æµØÖ·£¬ÐèҪʹÓà EIP
¼Ä´æÆ÷£¬ÄÇô return µÄʱºòÒª·µ»ØµÄµØÖ·ÓּǼÔÚÄÄÀïÄØ£¿¶ÔÓÚ¼ÇÐÔ²»ºÃµÄ CPU À´Ëµ£¬¿Ï ¶¨»á°ÑÕâ¸öµØÖ·±£´æÔÚij¸öµØ·½£¬Ã»´í£¬Ëü¾Í±£´æÔÚÕ»ÖУ¬µØÖ·ÊÇ[ESP]¡£
Òò´Ë£¬ÎÒÃDz»½ö¿ÉÒÔÀûÓÃ[ESP+4]£¬»¹¿ÉÒÔÀûÓÃ[ESP]À´ÆÛÆ CPU£¬ÆäʵֻҪÏò[ESP]д ÈëÒ»¸öºÏÊʵÄÖµ£¬¸æËß CPU Ó¦¸Ã·µ»Øµ½ÄĸöµØÖ·£¬task_b_main ÖоͿÉÒÔʹÓà return ÁË¡£
66
²âÊÔÔËÐÐËÙ¶È£¨harib12f£©
ÎÒÃǵijÌÐòÔËÐеúܿ죬¿ÉÊǵ½µ×Óжà¿ìÄØ£¿ÎÒÃǵÃÏë¸ö°ì·¨²âһϡ£¿ÉÄÜÓÐÈË»á˵£¬±ð¸ã ÕâÖÖ½ÚÍâÉúÖ¦µÄÍæÒâ¶ùÁË£¬¸Ï¿ì¼ÌÐøÍùϽ²°É£¡àÅ£¬ÒªËµÒ²ÊÇ£¬ÕâµÄÈ·ÊÇÓе㲻ÎñÕýÒµÁË£¬²»¹ý ¸ÃÍæµÄʱºòÒ²ÒªÍæÒ»ÍæÂ
ÎÒÃÇÏòtask_b_mainÌí¼ÓÁËһЩ´úÂë¡£ ±¾´ÎµÄbootpack.c½ÚÑ¡
void task_b_main(struct SHEET *sht_back) {
struct FIFO32 fifo;
struct TIMER *timer_ts, *timer_put, *timer_1s; int i, fifobuf[128], count = 0, count0 = 0; char s[12];
10 11 12 13 14 14 15
£¨ÖÐÂÔ£©
timer_1s = timer_alloc();
timer_init(timer_1s, &fifo, 100); timer_settime(timer_1s, 100); for (;;) {
count++; io_cli();
if (fifo32_status(&fifo) == 0) { io_sti(); } else {
i = fifo32_get(&fifo);
298 ¡¡ µÚ 15 Ì죺¶àÈÎÎñ£¨1£©
io_sti(); if (i == 1) { £¨ÖÐÂÔ£©
} else if (i == 2) { £¨ÖÐÂÔ£©
} else if (i == 100) {
sprintf(s, \
putfonts8_asc_sht(sht_back, 0, 128, COL8_FFFFFF, COL8_008484, s, 11); count0 = count;
timer_settime(timer_1s, 100); }
}
}
}
¡ö¡ö¡ö¡ö¡ö
ÎÒÃÇÀ´ÔËÐÐһϣ¬Ïȵÿ´¿´ËüÊDz»ÊÇÄÜÕý³£¹¤×÷£¬¨Dmake run¡¬¡£²»´í£¬ÔÚÄ£ÄâÆ÷»·¾³ÏÂÔËÐÐ ³É¹¦¡£
ÉÏÃæµÄÊý×ÖÏÔʾµÄÊÇËÙ¶ÈŶ
¡ö¡ö¡ö¡ö¡ö
ÏÖÔÚÎÒÃǵ½Õæ»ú»·¾³ÔËÐÐһϡ£ÍÛ£¬ºÃ¿ì£¡¹ûÈ»Õæ»ú»·¾³¾ÍÊǿ죬ËÙ¶ÈÒѾ´ïµ½´óÔ¼ 4638200¢ÙÁË¡£
ÎÒÃǰÑÕâ¸öËٶȺÍharib10i×ö¸ö¶Ô±È¡£harib10iÔÚ7ÃëÄÚ¼ÆÊýµ½0099969264£¬¼´ËÙ¶ÈΪÿÃë 14281323£¬Ïà±ÈÖ®ÏÂÐÔÄÜÊÇÏÖÔÚµÄ3±¶¡£ß×£¬Ôõô»áÕâÑù£¿Èç¹ûÊÇ2±¶µÄ»°»¹¿ÉÒÔÀí½â£¬3±¶¾ÍÓÐ µã¹ý·ÖÁË¡£
¿´µ½Õâ¸ö½á¹ûÐÄÀﵱȻ»áºÜ²»Ë¬£¬ÎÒÃÇÀ´ÕÒÕÒÔÒò¡£àÅ£¬Ã¿¸ô0.01ÃëË¢ÐÂÏÔʾÊDz»ÊDz»Ì«ºÃ ÄØ£¿Èç¹ûÏÔʾ¼ÆÊýÊǵ¼ÖÂËÙ¶ÈÂýµÄÔÒò£¬ÄǸɴà¾Í±ðÏÔʾÁ˰ɡ£ÎÒÃǰѿªÍ·µÄtimer_settime ¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª¡ª
¢Ù ×îºóÁ½Î»Êý×ÖµÄÖµ¾³£±ä¶¯£¬Òò´ËÓÃ00´úÌæ¡£