姓名:倪辉 学号:082972 年级:2008级 项目名称:源代码行数统计 项目完成日期:2009-06-19 项目源程序文件名:a.asm 本程序在 Linux 下运行,使用 nasm 汇编器编译,ld 链接。 编译方法:nasm -f elf a.asm -o a.o; ld -s -o a a.o; 使用说明:读取 C/C++ 源代码文件,计算文件中有效代码行数(即去除空行、注释行和只有空格、制表符的行剩余的行数) 用法:程序名 [文件名] 如 ./a test.cpp 运行后将在屏幕上输出有效代码行数, 如 Total codes lines: 5 如果文件打开失败(文件不存在或权限不够), 则输出:File open failed :( Usage: a [file] 主要知识点: 内核的调用 使用 int 80h 整数和字符串显示 输出直接调用 sys_write,整数先转为 ascii,每次除以 10,记录余数和商,然后把商再除以 10,直到个位数 命令行参数提取 程序开头的 pop 指令 文件操作 调用 sys_open sys_read sys_close 值得改进的地方: 多文件作为命令行参数,如 ./a a.c b.c c.c 即统计三个文件总共的代码行数 标准输入支持,以便可以使用管道和其他工具协作,如 cat *.h *.c | a 可统计当前目录下所有源代码文件的代码行数 心得体会:充分感受到过程性编程的思想和字符串语义分析的流程 注释风格://comment 和 /*comment*/ 可以识别跨越多行的 /*comment*/ 注释 注释风格鉴别策略(按优先级排序): --1.全面性无视空格和制表符 --2.空行不是有效的代码行 --3.只要以非斜杠开头,则为有效代码行 --4.遇到斜杠,有可能带有注释 |--4.1.如果斜杠后面紧跟星号,检查后续字符串 | |--4.1.1.遇到星号后接斜杠,则全是注释 | |--4.1.2.否则,如果遇到文件末尾(EOF),则全是有效代码行 |--4.2.如果斜杠后面紧跟斜杠,则本行后续字符串全是注释 |--4.3.否则,则为有效代码行 --5.直到遇到文件末尾(EOF) 1~7:数据段 9~12:无定义变量数据段 14~15:正文段(代码段),定义程序入口 18~21:从命令行参数中获取文件名 23~27:打开文件,返回文件描述符(调用内核 sys_open) 29~31:判断文件是否成功打开 33~38:读取文件内容(调用内核 sys_read) 40~41:保存文件描述符和读取到内容的实际长度 43~84:根据内容的字符计算有效代码行数(主要的算法部分) 85~97:将行数转换为 ascii 码的形式(逆序) 99~104:输出"Total lines: "字符串(调用内核 sys_write) 106~118:逆序输出行数的 ascii 字符串(调用内核 sys_write) 120~126:关闭文件(调用内核 sys_close) 128~133:输出打开文件失败时的字符串(调用内核 sys_write) 135~138:退出程序,返回 0(调用内核 sys_exit) 140~156:伪过程,输出一个换行符(调用内核 sys_write) 158~162:伪过程,增加有效代码行数计数器值 164~178:伪过程,跳过文件内容中的连续空格和制表符 180~192:伪过程,跳过当前行的剩余字符 194~238:伪过程,解析斜杠后的字符串