一种汇编查表程序
2012-07-02
标签: 查表程序

作者在开发‘带拼读的语音示教仪’时,遇到了这样一个要求:根据3个自变量(声母的键值、韵母的键值、四声键的键值)确定一个函数值(根据这三者拼出的读音的代号),其中自变量的值,函数的值都是已知的,但它们之间没有明确的对应关系,另外要求判断自变量是否有对应的函数值,一般常规的查表法不能使用,经过一番研究,作者自编了一个查表程序,解决了这个问题。

一、查表要求:

输入变量:1)声母的键值,2)韵母的键值,3)四声键的键值(在47-50间变化)。

输出结果:对应的读音的代号。

查表要求:根据输入判断是否有对应值,如有,则输出对应代号,如没有,则给出没有找到的标记。

二、查表程序:

;**********************************************************************

;双拼拼读处理

;入口:2EH和2DH中分别存入拼读的声母和韵母,2CH中存放拼读的四声键值,

;出口:找到则返回声音信号的序号值50H中,且06H置1

;如未找到,则06H清'0'

;R6作拼读总数计数器

;***********************************************************************

J_XH2:  
        PUSH PSW
        MOV R6,#0
        MOV DPTR,#J_X2
J2_LP0: 
        INC R6
        CLR A
        MOVC A,@A+DPTR
        CJNE A,2EH,J2_NOTEQH   ;取声母,比较,不等则转
        INC DPTR
        MOVC A,@A+DPTR
        CJNE A,2DH,J2_NOTEQL   ;若声母等,则韵母,不等转
        MOV A,2CH
        SUBB A,#47     ;减去47(基数,使键值从'0'开始,0到3)
        MOV R7,A       ;R7作四声键值记数器
J2_LOOP:
        CJNE R7,#0,J2_LOOP1    ;R7中的值不为0,则转去循环
        AJMP J2_DONE
J2_LOOP1:
        INC DPTR
        DEC R7
        AJMP J2_LOOP
J2_DONE:;取数

        INC DPTR
        CLR A
        MOVC A,@A+DPTR
        MOV 50H,A      ;存数
        SETB 06H
        AJMP J2_RET
J2_NOTEQH:
        INC DPTR
J2_NOTEQL:
        INC DPTR
        INC DPTR
        INC DPTR
        INC DPTR
        CJNE R6,#SPZS,J2_LP0   ;不等于双拼总数,则继续循环
        CLR 06H
J2_RET: 
        POP PSW
        RET
J_X2:   DB 18 26 100 101 102 103       ;zi
        DB 19 26 104 105 106 107       ;ci
        DB 20 26 108 109 110 111       ;si
        .
        .
        .

三、说明

使用本程序前,必须确切地知道表中共有多少个数据,并将定义一个常量:SPZS,即在程序的头部作如下定义(设表中共有100个数据):

SPZS EQU 100

根据这个程序,不难得到三拼的查表程序。以上程序已通过验证,证明运行无误。

这是我很早以前作的工作,请各位莫要见笑。


可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号