30Ìì×ÔÖÆ²Ù×÷ϵͳ

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´úÌæ¡£

ÁªÏµ¿Í·þ£º779662525#qq.com(#Ìæ»»Îª@)