查看: 3582|回复: 1

【SAM-4S Xplained手记】一个很xxx的词

[复制链接]
  • TA的每日心情
    郁闷
    昨天 09:47
  • 签到天数: 1623 天

    连续签到: 1 天

    [LV.Master]伴坛终老

    发表于 2013-2-6 09:51:21 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 nemon 于 2013-2-6 16:36 编辑

      据《战国策.赵策》中《秦围赵之邯郸》记载,“周烈王崩,诸侯皆吊,齐后往。周怒,赴于齐曰:‘天崩地坼,天子下席。东藩之臣田婴齐后至,则斫之!’(齐)威王勃然怒曰:‘叱嗟,而母婢也!’卒为天下笑。”用现在的话简单说就是周烈王挂了,齐威王拖着到最后一个去吊孝,周怒了,说你一住东边欠发达地区的家臣还敢这么怠慢,欠扁!齐王咆哮了“尼玛是丫头!”后来这句话流传开来,逐渐演变,从“尔母婢也”扩展成“尔母X也”,白话变成了“你妈的......”,之后再由第二人称改为第三人称,再用汉语拼音第一个字母代替,最后成了“TMD”三个响当当的字母。鲁迅先生都曾经撰文《论‘他妈的’》以述“这话的分布,大概就跟着中国人足迹之所至罢”,“只要在中国过活的话,便总听得到他妈的”,于是总结这三个字为中国“国骂”。
      不止中国有国骂,查百科看到各国风俗不同,在此一事上倒是不分伯仲。如果常看USA片,原声中F***恐怕是少不了的。不过大家都知道,骂并不都是表示侮辱,有时只是助词表示语气而已。对比一下fuckbrainbrainfuck,你会发现前者大概是"脑残"的意思而后者是一个很难读懂的摧残脑细胞的计算机语言。由于fuck在英语中是脏话,这种语言有时被称为brainf*ck或brainf***,甚至被简称为BF。BF语言只包括八个运算符,尽管如此,它是图灵完备的,像其它图灵机一样能够正确运行,可以完成任何计算任务。这种语言基于一个简单的机器模型,除了指令,这个机器还包括:一个以字节为单位、被初始化为零的数组、一个指向该数组的指针(初始时指向数组的第一个字节)、以及用于输入输出的两个字节流。下面是这八种状态的描述,其中每个状态由一个字符标识:
    字符含义
    > 指针加一
    < 指针减一
    + 指针指向的字节的值加一
    - 指针指向的字节的值减一
    . 输出指针指向的单元内容(ASCII码)
    , 输入内容到指针指向的单元(ASCII码)
    [ 如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
    ] 如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处
    下面我们就来运行一个BF的解释器:
    首先,打开串口做的控制台
    2013-02-05_184825_00016.png
    输入2,看一下现在的内存:
    2013-02-05_184859_00017.png
    内存都是0,然后选3输入程序:
    2013-02-05_184926_00018.png
    程序内容是,注意要在此基础上加@结尾:
    1. >;+++++++++[<++++++++>;-]<.>;+++++++[<++++>;-]<+.+++++++..+++.[-]>;++++++++[<++++>;-]<.#>;+++++++++++[<+++++>;-]<.>;++++++++[<+++>;-]<.+++.------.--------.[-]>;++++++++[<++++>;-]<+.[-]++++++++++.
    复制代码
    2013-02-05_184931_00019.png
    然后选4,看一下输入的程序:
    2013-02-05_184954_00021.png
    之后选5,运行程序,在两排减号之间是输出,
    2013-02-05_185001_00022.png
    可以看到,和大多数语言的第一个例子一样,这个程序输出“Hello World!”
    再按一次2看看内存。可以看到只用了第一个字节:
    2013-02-05_185035_00025.png
    下面看代码,首先是brainfuck.h:
    1. #ifndef BRAINFUCK_H
    2. #define BRAINFUCK_H

    3. #define BF_PROG_SIZE   500
    4. #define BF_MEMORY_SIZE 64

    5. #define BF_STACK_SIZE  16

    6. typedef void(*FB_OUT_CHAR)(char c);
    7. #define FUNC_FB_OUT_CHAR(funcname) void funcname(char c)
    8. //FUNC_FB_OUT_CHAR(out_char);

    9. typedef char(*FB_GET_CHAR)();
    10. #define FUNC_FB_GET_CHAR(funcname) char funcname()
    11. //FUNC_FB_GET_CHAR(out_char);

    12. void BrainFuckInterpret(unsigned char *pc_CmdLine,unsigned char *pc_Memory,FB_OUT_CHAR out_char, FB_GET_CHAR get_char);

    13. #endif //BRAINFUCK_H
    复制代码
    这是brainfuck.c,里面就是虚机的逻辑:
    1. #include "brainfuck.h"

    2. void BrainFuckInterpret(unsigned char *pc_CmdLine,unsigned char *pc_Memory,FB_OUT_CHAR out_char, FB_GET_CHAR get_char)
    3. {
    4.     //unsigned char uc_Memory[BF_MEMORY_SIZE]={0};
    5.         unsigned char *pc_PM=pc_Memory;
    6.         unsigned char *pc_PC=(unsigned char *)pc_CmdLine;
    7.     unsigned short us_CurrentStackCount=0;
    8.     unsigned short us_tmpStackCount=0;
    9.     unsigned char *uc_Stack[BF_STACK_SIZE]={0};
    10.         /*
    11.         for(us_tmpStackCount=0;us_tmpStackCount<BF_MEMORY_SIZE;us_tmpStackCount++)
    12.                 pc_Memory[us_tmpStackCount]=0;
    13.         us_tmpStackCount=0;
    14.         */

    15.         while(*pc_PC)
    16.         {
    17.                 switch(*pc_PC)
    18.                 {
    19.         case '>': //指针加一
    20.                         pc_PM++;
    21.                         pc_PC++;
    22.                         break;
    23.         case '<': //指针减一
    24.                         pc_PM--;
    25.                         pc_PC++;
    26.                         break;
    27.         case '+': //指针指向的字节的值加一
    28.                         (*pc_PM)++;
    29.                         pc_PC++;
    30.                         break;
    31.         case '-': //指针指向的字节的值减一
    32.                         (*pc_PM)--;
    33.                         pc_PC++;
    34.                         break;
    35.         case '.': //输出指针指向的单元内容(ASCII码)
    36.                         out_char(*pc_PM);
    37.                         pc_PC++;
    38.                         break;
    39.         case ',': //输入内容到指针指向的单元(ASCII码)
    40.                         (*pc_PM)=get_char();
    41.                         pc_PC++;
    42.                         break;
    43.         case '[': //如果指针指向的单元值为零,向后跳转到对应的]指令的次一指令处
    44.                         if((*pc_PM)==0)
    45.                         {
    46.                                 us_tmpStackCount=us_CurrentStackCount+1;
    47.                                 pc_PC++;
    48.                                 while(us_tmpStackCount>us_CurrentStackCount)
    49.                                 {
    50.                                         switch(*pc_PC++)
    51.                                         {
    52.                                         case '[':
    53.                                                 us_tmpStackCount++;
    54.                                                 break;
    55.                                         case ']':
    56.                                                 us_tmpStackCount--;
    57.                                                 break;
    58.                                         default:
    59.                                                 break;
    60.                                         }
    61.                                 }
    62.                         }
    63.                         else
    64.                         {
    65.                                 us_CurrentStackCount++;
    66.                                 uc_Stack[us_CurrentStackCount]=pc_PC;
    67.                                 pc_PC++;
    68.                         }
    69.                         break;
    70.         case ']': //如果指针指向的单元值不为零,向前跳转到对应的[指令的次一指令处
    71.                         if((*pc_PM)!=0)
    72.                         {
    73.                                 pc_PC=uc_Stack[us_CurrentStackCount]+1;
    74.                         }
    75.                         else
    76.                         {
    77.                                 us_CurrentStackCount--;
    78.                                 pc_PC++;
    79.                         }
    80.                         break;
    81.         default:
    82.                         pc_PC++;
    83.                         break;
    84.                 }
    85.         }
    86. }
    复制代码
    最后是菜单项的定义和事件响应以及相关函数:
    1. #include "brainfuck.h"

    2. //bf程序缓冲区
    3. unsigned char ucg_bf_file[BF_PROG_SIZE]={0};
    4. //bf内存缓冲区
    5. unsigned char ucg_bf_mem[BF_MEMORY_SIZE]={0};

    6. //打印一个字符
    7. FUNC_FB_OUT_CHAR(console_out_char)
    8. {
    9. printf("%c",c);
    10. }
    11. //读取一个字符
    12. FUNC_FB_GET_CHAR(console_get_char)
    13. {
    14. char c_char;
    15. uart_read(CONSOLE_UART, &c_char);
    16. while(c_char<32 || c_char>126)
    17. {
    18. uart_read(CONSOLE_UART, &c_char);
    19. }
    20. return c_char;
    21. }

    22. //事件响应
    23. void my_command_event(struct stCosnoleMenuRoot *stRt,unsigned int ui_ID)
    24. {
    25. char ac_buff[512]={0};
    26. unsigned int ui_l,ui_i,ui_j;
    27. printf("command 0x%x is be selected\r\n",ui_ID);
    28. switch(ui_ID)
    29. {
    30. case 0x11://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x11,"Clean Memory" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'1');//1
    31. printf("clearning...\r\n");
    32. for(ui_l=0;ui_l<BF_MEMORY_SIZE;ui_l++)ucg_bf_mem[ui_l]=0;
    33. printf("clearning done..\r\n");
    34. break;
    35. case 0x12://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x12,"Show Memory" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'2');//2
    36. printf("show memory:\r\n");
    37. printf("[address]");
    38. for(ui_l=0;ui_l<8;ui_l++)printf(" 0x%02x",ui_l);
    39. printf("\r\n");
    40. printf("-------------------------------------------------\r\n");
    41. for(ui_l=0;ui_l<BF_MEMORY_SIZE;ui_l++)
    42. {
    43. if(0==ui_l%8)printf("[0x%05x]",ui_l);
    44. printf(" 0x%02x",ucg_bf_mem[ui_l]);
    45. if(7==ui_l%8)printf("\r\n");
    46. }        
    47. printf("memory show as above.\r\n");
    48. break;
    49. case 0x13://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x13,"Input Program" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'3');//3
    50. ui_l=inputLineFromConsole("Input the Prog:",ucg_bf_file,BF_PROG_SIZE);
    51. printf("the program has %d char.\r\n",ui_l);
    52. break;
    53. case 0x14://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x14,"Show Program" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'4');//4
    54. printf("Program is:\r\n");
    55. printf("%s\r\n",ucg_bf_file);
    56. printf("the program shown as above.\r\n");
    57. break;
    58. case 0x15://iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x15,"Run Program " ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'5');//5
    59. printf("Program is running...\r\n-------------------------------------\r\n");
    60. BrainFuckInterpret(ucg_bf_file,ucg_bf_mem,console_out_char,console_get_char);
    61. printf("\r\n-------------------------------------\r\n");
    62. printf("the program is done.\r\n");
    63. break;
    64. }
    65. show_current_menu(&stMenu);
    66. }

    67. //菜单项的定义
    68. ………………
    69. iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x11,"Clean Memory" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'1');//1
    70. iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x12,"Show Memory" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'2');//2
    71. iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x13,"Input Program" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'3');//3
    72. iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x14,"Show Program" ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'4');//4
    73. iCnt=Cosnole_Add_A_Menu(&stMenu,0,0x15,"Run Program " ,MENU_TYPE_COMMAND,MENU_CHECK_TRUE,'5');//5
    74. ………………
    复制代码


    最后,再附一个fb的windows版的ide:
    bfdev-1-4-7.rar (330.83 KB, 下载次数: 7)
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2013-2-23 21:57
  • 签到天数: 5 天

    连续签到: 1 天

    [LV.2]偶尔看看I

    发表于 2013-2-6 15:19:15 | 显示全部楼层
    很好,很强大{:soso_e100:}
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /1 下一条

    手机版|小黑屋|与非网

    GMT+8, 2024-4-25 11:47 , Processed in 0.116905 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.