博文

我写的一个脚本解释器(2008-01-26 17:17:00)

摘要:下载地址 ====================================================================== 已经更新,为所有类型添加了成员函数,下面是所有全局函数和成员函数的说明。 全局函数:get()   // 返回一个记号,或者双引号括起来的字符串getline() // 返回一行print(...) // 打印所有参数println(...) // 打印所有参数,最后还输出一个回车exec(...) // 将所有参数作为控制台的字符串命令来执行,从左到右,            //直到某一个命令失败(返回结果不为0),并返回最后那个命令的返回值。 成员函数object.type() // 返回字符串             //"object", "string", "integer", "bool", "array", "nat"[not a type, e.g. null.type() = "nat"]object.string() // 将obj转换为字符串,相当于java的toStringobject.integer() // 将obj转换为整数object.bool()  // 将obj转换为bool string.length()string.indexOf(subs, [off])string.subString(start, count) array.length() // 返回数组的元素个数 注:所有值都是object,包括常量,string是字符串对象,array是数组。 function split(string, sparator){    if(sparator == null) sparator = "";    array = null;    count = 0;    while(string......

阅读全文(2665) | 评论:0

Concepts and Rvalue Reference : C++0x wi(2007-01-09 00:26:00)

摘要:Concepts and Rvalue Reference : C++0x will come C++0x马上就要出来了。目前已经有许多提议已经大致成型,下面是最有可能出现在C++0x标准中的几个提议: 一、Concepts Concept是BS极力要加入的一个新特性,用来对模板实例进行限制。例如 template<typename T>T max(T a, T b){    return a<b?b:a;} typename关键字允许T是任何实例,但是max的代码却对T有隐含的限制:T必须能够用“<”进行比较。 再例如 template<typename InputIterator>InputIterator advance(InputIterator iter, size_t n){    //...} InputIterator必须能够进行++操作。而考虑到advance对不同iterator的优化,可能需要iter+n的操作。 为了让编译器有效检查泛型参数的实例类型,加入Concept特性。 声明一个Concept: auto concept LessThanCompareable<typename T>{    bool operator < (T, T); // 必须存在该函数}; auto关键字表示对运算符重载进行更广义的匹配,例如T::operator(const T&)也被认为符合上面的Concept template<LessThanCompareable T>T max(T a, T b){    return a<b?b:a;} 或者使用where从句 template<typename T>T max(T a, T b)where LessThanCompareable<T>{    return a<b?b:a;} where从句可以对多个参数进行联合检查:auto concept Convertible<typename U, typename......

阅读全文(3941) | 评论:0

对线程的简单封装(2006-10-10 14:23:00)

摘要:线程是操作系统的一个概念。通常操作系统通过一组逻辑上关联的API函数实现对线程的操作。但是在面向对象编程中,C方式的API调用显然与其他的对象代码不符合。因此提供我的封装方法,简单有效,以Windows平台为例。 #pragma once#include <windows.h> class Thread{public:    Thread(const char *name)    : hThread(0), dwThread(0), bTerminated(false), pname(name){}    ~Thread()    {        End();    }    void Start()    {        if(hThread == 0)            hThread = CreateThread(0,0,                            (LPTHREAD_START_ROUTINE)Thread::ThreadProc,                            this,0,&dwThread......

阅读全文(4150) | 评论:0

大学时代接口实验之小键盘接口程序(2006-10-10 14:14:00)

摘要:需要和8255程序一同连接,注意初始化参数与引脚连接方式有关。 .286public _getcharextrn _i8255:near,_outpb:near,_inpa:neardseg segment para public 'DATA'INVALID equ 0ffhg_ch_tbl  db 'C','D','E','F','B','A','9','8'  db '4','5','6','7','3','2','1','0'  db 'W','X','Y','S','R','P','M','G'dseg endscseg segment para public 'CODE' assume cs:cseg,ds:dsegstart:_getchar proc   ;char getchar(){ call _testkey ; char al = testkey(); cmp al,0ffh  ; if(al == INVALID){ je gc_ret  ;   return INVALID;    ; }    ; else{ call _scankey  ;   al = scankey(); cmp al,INVALID ;   if(al == INVALID) return INVALID; je gc_ret mov bx,ax  ;   return g_ch_tbl[al]; mov al,g_ch_tbl[bx] ; } retgc_ret: mov ax,INVALID ret_getch......

阅读全文(7186) | 评论:1

大学时代接口实验:时钟的实现(2006-10-10 14:09:00)

摘要:该程序需要与8253、8255、8259、LED、小键盘对应的asm编译结果进行连接才可以通过。 (将8255和8253、8259以及LED和小键盘的程序分别编译为obj,然后所有obj一起link。) 8255的代码:http://blog.programfan.com/article.asp?id=19179 8253+8259的代码:http://blog.programfan.com/article.asp?id=19180 LED的代码:http://blog.programfan.com/article.asp?id=19181 小键盘的代码:http://blog.programfan.com/article.asp?id=19183 .286extrn _getchar:near,_setledbuf:near,_printled:near,_setmask:near ;displayextrn _setint:near,_clrint:near ;interruptionextrn _i8255:near,_i8253:near,_i8259:near ;initializationpublic chgflg,minute,seconddseg segment para public 'DATA'MAXCT equ 20shutfg db 0hchgflg db 0hchgfg2 db 0hsetmod db 0htmask db 0hcount db MAXCTminute db 0hsecond db 0hdseg endscseg segment para public 'CODE' assume cs:cseg,ds:dsegstart: mov ax,dseg mov ds,ax mov es,ax init: call _i8253 &nb......

阅读全文(4544) | 评论:2

大学时代接口实验LED接口代码(2006-10-10 14:05:00)

摘要:注释是对应的伪C代码,注意初始化参数和引脚连接方式有关。 .286public _getchar,_setledbuf,_addledbuf,_printled,_i8255,_delaydseg segment para public 'DATA'PORT_CON equ 21bhPORT_PA equ 218hPORT_PB equ 219hINVALID equ 0ffhg_led_buf db 6 dup(3fh)g_led_tbl db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h  db 7fh,6fh,77h,7ch,39h,5eh,79h,71hg_ch_tbl db 'C','D','E','F','B','A','9','8'  db '4','5','6','7','3','2','1','0'  db 'W','X','Y','S','R','P','M','G'dseg endscseg segment para public 'CODE' assume cs:cseg,ds:dseg_main proc   ;void main(void)start: mov ax,dseg  ;{ mov ds,ax mov es,ax  call _i8255  ; i8255();    ; while(true)    ; {mainlp: call _printled call _getchar ;  char key = getchar(); cmp al,'R'  ;  if(key != 'R')&......

阅读全文(5878) | 评论:0

大学时代8253+8259A芯片的接口程序(2006-10-10 13:57:00)

摘要:由于实验用的电路板固定了8259A芯片的中断向量为0A,因此程序中只使用10号中断。 _i8259和_i8253分别是两个芯片的初始化自程序,_setint和_clrint是设置中断和清理中断的自程序,_iserv是10号中断使用的中断服务子程序,其算法是用来计算时间来实现电子时钟的功能。只负责计算不负责输入和输出。可以根据需要改写此中断服务子程序。 注意:芯片的初始化参数根据芯片引脚的连接方式而定。 .286public _iserv,_setint,_clrint,_i8253,_i8259extrn minute:byte,second:byte,chgflg:byte ;for iserv()dseg segment para public 'DATA'P8253_A equ 208hP8253_B equ 209hP8253_C equ 20ahP8253_CON equ 20bhold0a dd ?dseg endscseg segment para public 'CODE'  assume cs:cseg,ds:dsegstart:_iserv proc   ;void iserv()  pusha   ;{  push ds  mov ax,dseg  mov ds,axis_beg:  cmp byte ptr chgflg,0h; if(!chgflg) goto is_exit //no change permitting  je is_exit  mov al,byte ptr second  cmp al,59h  ; if(second != 0x59)  je is_min  ; {  add al,1  ;  second += 1;&......

阅读全文(6512) | 评论:1

大学时代8255A芯片的接口程序(2006-10-10 13:49:00)

摘要:这个是8255A芯片的接口库,专门供其它的asm文件调用的。 _i8255是8255A初始化子程序 .286public _i8255,_outpb,_inpadseg segment para public 'DATA'PORT_CON equ 21bhPORT_PA equ 218hPORT_PB equ 219hINVALID equ 0ffhdseg endscseg segment para public 'CODE' assume cs:cseg,ds:dsegstart:_outpb proc   ;void outpb(char outcode) push dx  ;{ mov dx,PORT_PB out dx,al  ; _asm{out PORT_PB,outcode}; pop dx ret_outpb endp   ;} _inpa proc   ;char inpa() push dx  ;{ mov dx,PORT_PA in al,dx  ; _asm{in PORT_PA,al}; pop dx ret_inpa endp   ;} _i8255 proc   ;void i8255() push dx  ;{ mov dx,PORT_CON mov al,10010000b out dx,al pop dx ret_i8255 endp   ;} cseg ends end start......

阅读全文(6351) | 评论:0

位指针的模拟(2006-08-02 20:08:00)

摘要:struct __bit_ptr{    typedef unsigned char byte;    typedef __bit_ptr bit_type;    byte * pbyte;    int pos;     __bit_ptr() : pbyte(0), pos(0) {}    __bit_ptr(const __bit_ptr& ptr) : pbyte(ptr.pbyte), pos(ptr.pos) {}    bool is_valid() {return pbyte!=0;}    __bit_ptr& operator++ ()    {        if(++pos>=8){ pos=0; pbyte++; }        return *this;    }    __bit_ptr operator++ (int)    {        __bit_ptr bp(*this);        if(++pos>=8){ pos=0; pbyte++; }        return bp;    }    __bit_ptr& operator += (int n)    {        pos += n;  ......

阅读全文(3850) | 评论:0

分析类型的一个小实验(2006-08-01 21:10:00)

摘要:#include <cstdlib>#include <iostream>using namespace std;template<typename T>void print(const T &a) {cout << "unknown" << endl;}template<>void print<double>(const double &a) {cout << "double" << endl;}template<>void print<float>(const float &a) {cout << "float" << endl;}template<>void print<int>(const int &a) {cout << "int" << endl;}int main(int argc, char *argv[]){    char a;int b;float c;short int  d;    print((c*b+a)*d);    system("PAUSE");    return 0;}float请按任意键继续. . .......

阅读全文(3084) | 评论:1