第一篇:Tiny C 语言编译程序实验一 Scanner
Tiny C语言编译程序实验一 Scanner Tiny C语言编译程序实验一 Scanner 要求:填写getToken()函数,完成词法分析器scan.c。
约定:
仅允许整数类型,不允许实数类型
标识符由大小写英文字母组成,最多52个。其识别按最长匹配原则 整数后紧跟非数字,或标识符后紧跟非字母认为是一个新Token开始 由{ }括起来符号串都认为是注释部分,该部分在词法分析时被过滤掉
识别出的Token由两个变量:currentToken,tokenString识别,其中currentToken代表Token的类属,为一个名为TokenType的枚举类型,在文件globals.h中定义;tokenString代表Token在程序中出现的形式,即其本来面目。例如整数10的currentToken值为NUM,而tokenString值为‘10’;标识符i的currentToken值为ID,而tokenString值为‘i’
typedef enum
{ ENDFILE,ERROR,IF,THEN,ELSE,END,REPEAT,UNTIL,READ,WRITE,/* 保留字 */
ID,NUM, ASSIGN,EQ,LT,PLUS,MINUS,TIMES,OVER,LPAREN,RPAREN,SEMI :=
= <
+
*
/
()
;
} TokenType;
画识别符合TINY C语言构词规则的DFA。然后用直接编码的方法构造词法分析器
/****************************************************/ /* File: scan.c
*/ /* The scanner implementation for the TINY compiler
*/ /****************************************************/ #include “globals.h”
#include “util.h”
#include “scan.h”
typedef enum
{ START, INASSIGN, INCOMMENT, INNUM, INID, DONE } StateType;char tokenString[MAXTOKENLEN+1];static int getNextChar(void)
//获得下一字符
Tiny C语言编译程序实验一 Scanner
static struct
{ char* str;
TokenType tok;
} reservedWords[MAXRESERVED]
= {{“if”,IF},{“then”,THEN},{“else”,ELSE},{“end”,END},{“repeat”,REPEAT},{“until”,UNTIL},{“read”,READ},{“write”,WRITE}};
//定义保留字表
static TokenType reservedLookup(char * s)
//进行保留字的匹配 {实现请自己看scan.c文件}
/**********************************************/ /* the primary function of the scanner
*/ /* function getToken returns the next token in source file */ /**********************************************/ TokenType getToken(void){ int tokenStringIndex = 0;
TokenType currentToken;
//保存被识别Token的类属
StateType state = START;
//初始状态为START
int save;
//标识当前字符是否保存,如空格,换行符n、TAB符t及注释中的任何字符
while(state!= DONE)
//DONE状态表示已识别出一个Token
{ int c = getNextChar();
save = TRUE;
switch(state)
{ case START:
if(isdigit(c))
state = INNUM;
else if(isletter(c))
{ state=DONE;currentToken=END;state=INID;state=INASSIGN;state=INCOMMENT;else if(c==':')else if(c=='{')else
}
break;
case INCOMMENT:
if(c=='}')
Tiny C语言编译程序实验一 Scanner
{ state=DONE;currentToken=END;}
break;case INASSIGN: if(c=='=')
{
} else { error();currentToken=ERROR };/* 此处已填写完整 */ state=DONE;currentToken=ASSIGN;break;
case INNUM:
if(!isdigit(c))
{ /* backup in the input */
ungetNextChar();
save = FALSE;
state = DONE;
currentToken = NUM;
}
break;
case INID:
if(!isletter(c)){ /* backup in the input */ ungetNextChar();save = FALSE;state = DONE;currentToken =ID;
break;
case DONE: //不可能到
default: /* should never happen */
fprintf(listing,“Scanner Bug: state= %dn”,state);
state = DONE;
currentToken = ERROR;
break;
}
if((save)&&(tokenStringIndex <= MAXTOKENLEN))
tokenString[tokenStringIndex++] =(char)c;
if(state == DONE)
Tiny C语言编译程序实验一 Scanner
{ tokenString[tokenStringIndex] = ' ';
if(currentToken == ID)
currentToken = reservedLookup(tokenString);
}
}
---------end WHILE
if(TraceScan){
fprintf(listing,“t%d: ”,lineno);
printToken(currentToken,tokenString);
}
return currentToken;} /* end getToken */
第二篇:实验一 语言实验
微机原理与接口技术实验(1)
实验一 汇编语言程序上机过程 1 实验二 屏幕字符显示程序 3 实验三 音乐程序 5 实验四 键盘和窗口程序 7 实验五 活动图形显示程序 9 实验六 磁盘文件操作程序 12
实验
一、实验二必做,其余可以选做
实验一 汇编语言程序上机过程
实验目的:
1、掌握常用工具软件 PE,MASM和LINK的使用。
2、伪指令: SEGMENT,ENDS,ASSUME,END,OFFSET,DUP。
3、利用的 1号功能实现键盘输入的方法。
4、了解.EXE文件和.COM文件的区别及用INT 21H 4C号功能返回系统的方法。程序: data segment message db 'This is a sample program of keyboard and disply' db 0dh,0ah,'Please strike the key!',0dh,0ah,'$' data ends stack segment para stack 'stack' db 50 dup(?)stack ends code segment assume cs:code,ds:data,ss:stack start: mov ax,data mov ds,ax mov dx,offset message mov ah,9 int 21h again: mov ah,1 int 21h cmp al,1bh je exit cmp al,61h jc nd cmp al,7ah ja nd and al,11011111b nd: mov dl,al mov ah,2 int 21h jmp again exit: mov ah,4ch int 21h code ends end start 实验步骤:
1、用用文字编辑工具(记事本或EDIT)将源程序输入,其扩展名为.ASM。
2、用MASM对源文件进行汇编,产生.OBJ文件和.LST文件。若汇编时提示有错,用文字编辑工具修改源程序后重新汇编,直至通过。
3、用TYPE命令显示1产生的.LST文件。
4、用LINK将.OBJ文件连接成可执行的.EXE文件。
5、在DOS状态下运行LINK产生的。EXE文件。即在屏幕上显示标题并提示你按键。每按一键在屏幕上显示二个相同的字符,但小写字母被改成大写。按ESC键可返回DOS。若未出现预期结果,用DEBUG检查程序。实验报告:
1、汇编,连接及调试时产生的错误,其原因及解决办法。
2、思考:
1)若在源程序中把INT 21H的'H'省去,会产生什么现象? 2)把 INT 21H 4CH号功能改为 INT 20H,行不行?
实验二 屏幕字符显示程序
实验目的:
通过实验掌握下列知识: 1、8086指令: JMP,ROR,XOR,HLT。
2、利用DOS功能调用INT21H的2号和9号功能进行屏幕显示的方法。
3、直接向视频RAM(VRAM)送ASCII码进行屏幕显示的方法。
4、IBM-PC机的ASCII码表及控制字符。
5、命令(。COM)文件及使用方法。
6、利用^Break退出程序的方法及局限性。实验内容及步骤:
一、利用INT 21 0AH号功能调用显示字符串。
1、用A命令在100H处键入下列程序: MOV AH, 9 MOV DX,110 INT 21 INT 20
2、用A命令在110H处键入下列字符串的ASCII码: DB 'This is a sample!$'
3、用N命令和W命令将此程序(包括数据区)存入文件名为AA。COM的磁盘文件中。(存入前BX:CX必须置为文件长度值)。
4、用Q命令退出DEBUG。
5、在DOS命令下打AA,运行此程序,即在屏幕上显示'This is a sample!'字符串,若不出现,用DEBUG检查程序有无错误。
二、利用INT 21H 2号功能显示字符:
1、用A命令在100H处键入下列程序: XOR DL,DL MOVCX,100 LOP:MOV AH,2 INT 21 INC DL PUSH CX MOV CX,8 DELY: PUSH CX MOV CX,0 J: LOOP J POP CX LOOP DELY POP CX LOOP LOP INT 20
2、用G命令运行程序,即在屏幕上依次缓慢的显示256个ASCII字符。仔细观察每个字符,和IBM-PC ASCII码表对照,看07H-0DH处控制字符显示结果与表上有何不同?
3、按CTRL+BREAK退出此程序,若一次不行可多做几次。
三、直接向VRAM送ASCII码显示字符
1、用A命令在100H处键入下列程序: MOV AX,B000 MOV DS,AX XOR AL,AL XOR BX,BX MOV CX,100 LOP: MOV [BX],AL INC BX INC AL PUSH CX MOV CX,8 DELY: PUSH CX MOV CX,0 J: LOOP J POP CX LOOP DELY POP CX LOOP LOP INT 20
2、用N命令和W命令将此程序存入BB.COM文件中。(一定要先存入!)
3、用G命令运行此程序,仔细观察每一个ASCII码显示结果,并和字符表及上一道程序运行情况进行对照,其控制字符区(07-0DH)显示结果和INT 21H2号功能调用有何不同? 四。自编一个程序,要求显示AX的内容,即能显示AX=xxxx。
调试时AX的内容可用R命令赋值,也可用MOV指令赋值。实验报告要求:
1、各项实验记录及观察体会。
2、利用INT 21H显示和直接向VRAM送ASCII码显示方法在显示结果上有什么不同?
3、自编程序草稿及调试结果。
实验三 音乐程序
实验目的:
1、掌握PC机发音原理及音乐程序编制方法。2、8086指令: IN,OUT,DIV,OR 实验内容:
一、发音程序。
1、用DEBUG输入下列程序: MOV DX,4000H IN AL,61H AND AL,FCH LOP: XOR AL,02H OUT 61H,AL MOV CX,0140H DEY: LOOP LOP DEC DX JNE LOP INT 21H INT 20H
2、在DEBUG下运行此程序,改变延时时间常数,注意声音高低变化。
二、音乐程序。
1、输入,汇编,连接并运行下列程序: stacksg segment para stack dw 32 dup(?)stacksg ends datasg segment tiger db 0ah,0dh,'two tiger。$' tig_freq dw 2 dup(262,294,330,262)dw 2 dup(330,349,392)dw 2 dup(392,440,392,349,330,262)dw 2 dup(294,196,262),0ffffh tig_time dw 10 dup(25),50,25,25,50 dw 2 dup(12,12,12,12,25,25)dw 2 dup(25,25,50)datasg ends codesg segment assume cs:codesg,ds:datasg,ss:stacksg start: mov ax,datasg mov ds,ax lea dx,tiger mov ah,9 int 21h lea si,tig_freq lea bp,ds:tig_time call play mov ah,4ch int 21h play proc freq: mov di,[si] cmp di,0ffffh je end_ply mov bx,ds:[bp] call sound add si,2 add bp,2 jmp freq end_ply: ret play endp sound proc mov al,0b6h out 43h,al mov dx,14h mov ax,4f38h div di out 42h,al mov al,ah out 42h,al in al,61h mov ah,al or al,3 out 61h,al wait: mov cx,5000 spkr_on: loop spkr_on dec bx jnz wait mov al,ah out 61h,al ret sound endp codesg ends end start
2、修改程序,使它能演奏一首你所喜爱的歌曲。
3、若歌曲中有休止符,怎么办? 实验报告:
1、实验记录和体会。
2、自编程序。
实验四 键盘和窗口程序
实验目的:
1、掌握利用INT 16H 2号功能调用实行键盘输入的方法。
2、熟悉键盘的扫描码和ASCII码的关系。
3、掌握利用INT 10H功能调用实现窗口功能的方法。实验内容:
一、键盘输入程序
1、程序: PRO_NAM AGAIN: BINIHEX ROTATE: PRINT: SEGMENT ASSUME CS:PRO_NAM ORG 100H MOV AH,0 INT 16H MOV BX,AX CALL BINIHEX MOV AH,2 MOV dl,20h INT 21H MOV DL,BL MOV AH,2 INT 21H MOV DL,0DH MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H JMP AGAIN INT 20H PROC NEAR MOV CH,4 MOV CL,4 ROL BX,CL MOV AL,BL AND AL,0FH ADD AL,30H CMP AL,3AH JL PRINT ADD AL,7 MOV DL,AL MOV AH,2 INT 21H DEC CH JNZ ROTATE RET BINIHEX ENDP PRO_NAM ENDS END AGAIN
2、输入,汇编,连接此程序,并将它转变成。COM文件。
3、运行此程序,观察并记录各个键的扫描码,ASCII码及对应字符。
二、窗口程序:
1、程序: code segment assume cs:code,ss:code org 100h start: mov ax,600h mov cx,0 mov dx,184fh mov bh,7 int 10h pos: mov ah,2 mov dx,101eh mov bh,0 int 10h mov cx,20 get: mov ah,1 int 21h cmp al,1bh jz exit loop get mov ax,601h mov cx,81eh mov dx,1031h mov bh,7 int 10h jmp pos exit: int 20h code ends end start
2、将此程序输入并转变成。COM文件。
3、运行此程序,观察按不同键所产生的效果。
4、此程序所产生的窗口效果有何缺陷?试修改之。实验报告:
1、实验记录。
2、自编程序。
实验五 活动图形显示程序
实验目的:
1、掌握利用INT 10H实现活动图形的方法。
2、INT 10H 的 2号,6号,0AH号功能。实验内容:
参考下列程序自编一活动的复合图形显示程序。程序一 活动字符图形显示程序: stack segment stack db 256 dup(0)stack ends code segment assumecs: code,ss:stack move: mov cx,0 mov dx,184fh mov bh,7 mov ax,0618h int 10h mov dx,0 mov cx,1 mov bh,0 rept: mov ah,2 int 10h mov ah,10 mov al,0fh int 10h call dely mov al,20h mov ah,10 int 10h inc dh inc dl inc dl cmp dh,25 jne rept mov ah,4ch int 21h dely proc push cx push dx mov cx,5 lop: mov dx,0 lop1: dec dx jne lop1 loop lop pop dx pop cx ret dely endp code ends end move 程序二静止复合图形显示程序: stack segment stack db 256 dup(0)stack ends data segment chrtab dw 7 db 0dbh,0,0,0dbh,0,1 db 0dbh,0,1,52h,0,1 db 1,-1,-1,9,2,0 db 9,0,-2 data ends code segment assume cs:code,ss:stack,ds:data start: mov ax,data mov ds,ax mov cx,0 mov dx,184fh mov bh,7 mov ax,0618h int 10h lea di,chrtab mov cx,[di] mov dx,400h add di,2 next: add dh,[di+1] add dl,[di+2] mov ah,2 mov bh,0 int 10h push cx mov cx,1 mov ah,10 mov al,[di] int 10h pop cx add di,3 loop next mov ah,4ch int 21h code ends end start 实验报告:
1、自编程序。
2、调试中产生的问题。
实验六 磁盘文件操作程序
实验目的:
1、掌握利用FCB进行磁盘文件读写的方法。
2、掌握利用HANDLE进行磁盘文件读写的方法。
3、INT 21H 0FH,10H,14H,15H,16H,1AH号功能调用。
4、INT 21H 3CH,3DH,3FH,40H号功能调用。实验内容:
一、文本文件内容显示程序: stack segment stack db 100h dup(?)stack ends data segment fcb db 36 dup(0)count db 0 char db 0 dta db 0 errmsg db 'file access error' data ends code segment main proc far assume cs:code,ss:stack start: push ds sub ax,ax push ax mov ax,data mov es,ax assume es:data mov si,5ch mov di,offset fcb mov cx,12 cld rep movsb mov ds,ax assume ds:data mov dx,offset dta mov ah,1ah int 21h mov dx,offset fcb mov ah,0fh int 21h cmp al,0 jnz error mov word ptr fcb+0ch,0 mov word ptr fcb+0eh,1 again: tab: eof: error: display disp1: mov fcb+20h,0 lea dx,fcb mov ah,14h int 21h cmp al,0 jnz error mov al,dta cmp al,1ah jz eof cmp al,9 jz tab call dispchar inc char cmp dta,0ah jnz again mov char,0 inc count cmp count,24 jnz again mov ah,0 int 16h mov count,0 jmp again mov al,' ' call dispchar inc char test char,7 jz again jmp tab lea dx,fcb mov ah,10h int 21h ret lea bx,errmsg call display ret proc mov cx,30 mov al,[bx] call dispchar inc bx loop disp1 mov al,0dh call dispchar mov al,0ah call dispchar ret display endp dispchar proc push bx mov bx,0 mov ah,14 int 10h pop bx ret dispchar endp main endp code ends end start
1、输入,汇编,连接此程序,用DEBUG将目的程序带参数调入,用D命令观看并记录 PSP中的FCB内容。
2、运行此程序。
二、磁盘文件拷贝程序(参考): stack segment stack db 100h dup(9)stack ends;data segment sfile db 64 db ? db 64 dup(' ')dfile db 64 db ? db 64 dup(' ')ask1 db 0ah,0dh,'please input source' db 'file name:','$' ask2 db 0ah,0dh,'please input destnation' db 'file name:','$' note db 0ah,0dh,'please insert diskettes' db 'and strike any when ready ','$' er1 db 0ah,0dh,'create error $' er2 db 0ah,0dh,'open error$' er3 db 0ah,0dh,'read error$' er4 db 0ah,0dh,'write error$' er5 db 0ah,0dh,'close source file error' er6 db 0ah,0dh,'close dest file error' bufr dw ? data ends code segment assume cs:code,ds:data,ss:stack start proc push sub push mov mov mov lea call lea far ds ax,ax ax ax,data ds,ax es,ax dx,ask1 disp dx,sfile call mov xor mov mov lea call lea call mov xor mov mov lea call mov int call ret start endp disp proc mov int ret disp endp inpt proc mov int ret inpt endp copy proc mov lea mov int inpt cl,sfile+1 ch,ch si,cx [si+sfile+2],0 dx,ask2 disp dx,dfile inpt cl,dfile+1 ch,ch si,cx [si+dfile+2],0 dx,note disp ah,7 21h copy ah,9 21h ah,0ah 21h ah,3ch dx,dfile+2 cx,20h 21h lea mov jc mov mov mov lea int lea mov jc r_w: mov mov lea int lea jc or je mov lea xchg int lea jc xchg jmp exit: mov int lea jc xchg mov int lea jc ret err: mov int xchg mov int call ret copy endp dx,er1 bx,ax err bufr,ax ah,3dh al,0 dx,sfile+2 21h dx,er2 bx,ax err cx,10h ah,3fh dx,sfile+2 21h dx,er3 err ax,ax exit ah,40h dx,sfile+2 bufr,bx 21h dx,er4 err bufr,bx r_w ah,3eh 21h dx,er5 err bufr,bx ah,3eh 21h dx,er6 err ah,3eh 21h bufr,bx ah,3eh 21h disp ends end start 按COPY AAA BBB 格式要求改写此程序,取消人机对话,源文件和目的文件名由 命令行输入。实验报告:
1、自编程序原稿和调试后的正确清单。
2、实验中产生的问题及体会。
3、实验记录。code
第三篇:实验一语言上机操作训练
实验一汇编语言上机操作训练——比较字符串
实验项目名称:比较字符串
实验项目性质:普通
所属课程名称:微机原理与应用
实验计划学士:
2一、实验目的1、学习程序设计的基本方法和技能;
2、熟悉掌握汇编语言设计、编写、调试和运行。
二、实验内容和要求
汇编语言程序上机操作方法
编写一程序,比较两个字符串string1和string2所含字符是否相同,若相同则在屏幕上显示“MATCH”,否则显示“NOTMATCH”。
三、实验主要仪器设备和材料
计算机一台
四、程序功能:
比较字符串string1和string2是否相同,若相同则在屏幕显示MATCH,否则显示NO MATCH。
五、思考题
1、将内存data1单元开始的0-15共16个数传送到data2单元开始的数据区中。
答:数据段代码程序例子如下:
DATASEGMENT
DATA1 DB 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15
DATA2 DB 10H DUP(?)
DATAENDS2、将程序中的指令中JZ MATCH 改为 JNZ MATCH,程序结果如何?为什么?
答:程序结果会变为:若string1和string2不相等就输出MATCH。
因为JNZ指令的意思是非零就跳转,所以结果与原程序相反,原程序是相等就输出MATCH,改为JNZ MATCH后就变为不相等就输出MATCH。
第四篇:实验一
实验一创业项目的选择LED照明
1.1产品介绍
LED(Light Emitting Diode),发光二极管,是一种固态的半导体器件,它可以直接把电转化为光。LED的心脏是一个半导体的晶片,晶片的一端附在一个支架上,一端是负极,另一端连接电源的正极,使整个晶片被环氧树脂封装起来。半导体晶片由两部分组成,一部分是P型半导体,在它里面空穴占主导地位,另一端是N型半导体,在这边主要是电子。但这两种半导体连接起来的时候,它们之间就形成一个“P-N结”。当电流通过导线作用于这个晶片的时候,电子就会被推向P区,在P区里电子跟空穴复合,然后就会以光子的形式发出能量,这就是LED发光的原理。而光的波长决定光的颜色,是由形成P-N结材料的禁带宽度决定的。自20世纪60年代世界第一个半导体发光二极管诞生以来,LED照明由于具有寿命长、节能、色彩丰富、安全、环保的特性,被誉为人类照明的第三次革命。
1.2市场现状
据统计,地球上每天使用的电量是相当惊人的,所以,这些年我们都致力于寻找节约、环保的新能源,而本公司的LED灯顺应时代,应运而生。白光LED的光电转化率高达95%以上,节能性十倍于普通白炽灯,两倍于荧光灯。众所周知,白炽灯的使用会引起惰性气体的污染,荧光灯的使用会引起汞的污染,而白光LED灯在使用时不会放出任何有害气体损害生态环境,是新的环保光源,因此,LED节能灯有很大的发展潜力。
当前,照明约占世界总能耗的20%左右。中国从2003年开始,就已经频频遭遇电力短缺的危机,由此也引发了社会对替代能源和新能源的思考。有统计数据显示,仅LED路灯节能一项,每年就能为中国节省约一座三峡大坝所发的电力。在全球能源危机紧张的今天,LED照明产品的节能优势则预示了其不可撼动的未来行业龙头地位:据业内人士以1支11瓦优质节能灯为例,用数字证明了产品的绝对优势:这样一支节能灯在6000小时的寿命期内,将比具有相同效果的60瓦白炽灯少耗电294千瓦时,节约支出160多元。
根据中国光学电子协会光电分会的统计,我国的LED照明产品自2003年起,正以每年25%以上的速度增长,其中超高亮照明LED更以每年50%的速度飞跃发展。到2013年,阅读灯、橱窗灯、户外照明、投光灯、家用照明、家用电器光源等传统灯具将逐步被LED取代。业内专家直言,仅中国民用照明市场来讲,存在的商机就达400亿元人民币。
2011年2月底,国家相关部门在中国半导体照明市场产业现状及未来发展机会暨“Green Lighting China 2011 展会暨论坛”的新闻发布会上透露,将于近期出台传统白炽灯的退出时间表,这一信息预示着LED照明市场的繁荣期即将到来。目前,我国农村地区和部分小城市大多数照明都是以传统灯泡为主。
1.3竞争优势
1.4企业未来的发展
1.5总结
第五篇:实验一
实验一
实验1 安装操作系统一.实验目的通过对OS的安装操作,了解操作系统应用环境建立的初步过程。
1.掌握操作系统的基本系统设置。
2.熟练掌握操作系统的安装步骤。
二.实验属性
验证
三.实验内容
安装OS
四.实验步骤
1.把系统盘安装到本地计算机。
2.安装步骤
第一步:插入OS安装光盘,重新启动计算机
第二步:对硬盘创建分区,留出交换空间和文件系统的空间。按屏幕提示选择第三步:按提示分阶段装入系统。
第四步:配置系统。
五.实验报告
1.根据提示,写出OS的安装思路。
2.写出OS在计算机硬件上的加载过程。
3.总结体会OS各部分功能的实现。