单词记忆测试器程序的设计说明.docx
《单词记忆测试器程序的设计说明.docx》由会员分享,可在线阅读,更多相关《单词记忆测试器程序的设计说明.docx(17页珍藏版)》请在冰豆网上搜索。
单词记忆测试器程序的设计说明
b6db1000hdup('$')
b9db'Youdonotknowthefollowingwords,pleaserememberthemagian',0ah,0dh,'$'
f1db'verygood,congratulationstoyou',0ah,0dh,'$'
callzi4;输出不认识的单词
movah,02h;回车换行
movdl,0dh
int21h
movah,02h
movdl,0ah
int21h
callzi2;将不认识的单词存到B6所指单元
callzi2;将不认识的单词存到B6所指单元
m2:
incdi
leasi,b6;将不认识的单词放到B6所指单元1111
movsi,z;保留SI的地址
zi4proc
pushax
pushbx
pushcx
pushdx
pushsi
pushdi
leadx,b9;输出不认识的单词
movah,09h
int21h
leadx,b6
movah,09h
int21h
popdi
popsi
popdx
popcx
popbx
popax
ret
zi4endp
操作说明:
一、输入单词:
;1、提示输入单词,输入最少5个、最多255个英文单词,每个单词不超过20个字符。
2、若直接回车,则结束单词输入,进入单词测试;3、输足20个字符,自动进入下一个单词的输入;4、不足20个字符个字符,按回车键进入下一个单词的输入。
;二、单词记忆测试:
1、从输入的第一个单词开始测试2、键入'y'(不分大小写)或'n',回答是否认识,不需按回车键确认,其它按键无效;3、紧接着,没有提示,可按上移键或下移键循环测试;4、按Esc键结束测试。
三、计算单词识别率并显示输出;四、提示是否进行下一组单词的输入和测试,键入'y'(不分大小写)或'n'选择是否继续,不需按回车键确认,其它按键无效。
本程序在MASMPlus1.2集成环境下通过编译,经过调试,运行正确。
CodeSegment
AssumeCS:
Code,DS:
Code
;-------------------------------------
;功能:
显示指定地址(Str_Addr)的字符串
;入口:
Str_Addr=字符串地址(要求在数据段)
;用法:
OutputStr_Addr用法举例:
OutputPromptStr)
OutputMACROStr_Addr
pushax
leadx,Str_Addr
movah,9
int21h
popax
EndM
;-------------------------------------
;功能:
输出一个字符
;入口:
dl=要显示的字符
Output_ChrprocNear
pushax
movah,02h
int21h
popax
ret
Output_Chrendp
;-------------------------------------
;功能:
输出回车换行
Output_CTLFprocNear
pushax
pushdx
movah,02h
movdl,0dh
int21h
movdl,0ah
int21h
popdx
popax
ret
Output_CTLFendp
;-------------------------------------
;功能:
把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
;入口:
AX=二进制数
;出口:
在当前光标位置显示转换后的ASCII码数字
Dec_ASCIIProcNear
pushdx
pushbx
pushdi
movbx,10
leadi,Temp_Save[6]
movBYTEptr[di],'$'
decdi
Divide:
xordx,dx
divbx
ordl,30h
mov[di],dl
decdi
testax,0ffffh
jnzDivide
incdi
pushdi
popdx
movah,9
int21h
popdi
popbx
popdx
ret
Temp_Savedb7dup(?
)
Dec_ASCIIEndP
;-------------------------------------
;功能:
键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回
;入口:
无
;出口:
若输入的是'y',进位标志置位;若输入的是'n',进位标志复位。
Yes_or_NoprocNear
pushdx
pushax
Input_Chr:
movah,7;不带回显的键盘输入
int21h
movdl,al
andal,0dfh
cmpal,'Y'
jnz$+5
stc
jmp$+7
cmpal,'N'
jnzInput_Chr
clc
movah,2
int21h
popax
popdx
ret
Yes_or_NoEndp
;-------------------------------------
Input_WordsProcNear;输入一组单词
xorcl,cl;输入的单词数目初值
leabx,Buffer;数据缓冲区地址
movdi,bx
OutputPrompt_Str1;提示输入单词
Input_Words:
cmpcl,255
jzTermanate;限定最多255个单词
mov[bx.Recognise],No;初始化识别标志
mov[bx.previous],di;前一个节点地址
mov[bx.Next],Chrs+1;每个单词最多字符数
movdi,bx
leadx,[bx.Next];键盘输入缓冲区地址
movah,0ah;输入单词
int21h
movsi,dx
incsi
lodsb;读入实际输入的字符个数,即单词长度
testal,al;直接回车?
jzTermanate;是,结束单词输入
inccl;累计输入的单词数目
xorah,ah
addsi,ax
mov[si],'$';使之能用dos功能调用9号功能显示这个字符串(单词)
incsi
mov[bx.Next],si;下一个节点地址
movbx,si
callOutput_CTLF;输出一个回车、换行
jmpInput_Words;输入下一个单词
Termanate:
cmpcl,5
jbInput_Words;限定最少5个单词
movWords,cl;保存单词数目
leasi,Buffer;数据缓冲区地址
movbx,[bx.previous]
mov[si.previous],bx;把第一个节点的前一个节点地址指向最后一个节点
mov[bx.Next],si;把最后一个节点的下一个节点地址指向第一个节点,形成循环链表
callOutput_CTLF
ret
Input_WordsEndP
;-------------------------------------
Test_WordsProcNear
callOutput_CTLF
callOutput_CTLF
leadx,[si.Next][2]
movah,9
int21h
callOutput_CTLF
OutputPrompt_Str2;要求回答是否认识这个词汇,回答字母不分大小写
Recognise:
or[si.Recognise],Yes
callYes_or_No
jcUp_Down
and[si.Recognise],No
Up_Down:
xorah,ah
int16h
cmpah,KBEsc
jnz$+3
ret
cmpah,KBUp
jnzNext_KBDown
movsi,[si.previous]
jmpTest_Words
Next_KBDown:
cmpah,KBDown
jnzUp_Down
movsi,[si.Next]
jmpTest_Words
Test_WordsEndP
;-------------------------------------
Statics_WordsProcNear;计算单词识别率
movcl,Words;取单词数
xorch,ch
leasi,Buffer;数据缓冲区地址
movbx,[si.Next]
xorax,ax
L0:
addal,[si.Recognise];累加识别率
movsi,[si.Next]
loopL0
movbl,100
mulbl
divWords
OutputPrompt_Str3;提示显示单词识别率
callDec_ASCII;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
movdl,'%'
callOutput_Chr;显示输出一个字符
ret
Statics_WordsEndP
;-------------------------------------
Chrsequ20;单词最多字符数
Yesequ1;认识
Noequ0;不认识
KBEscequ1;Esc键扫描码
KBUpequ48H;↑键扫描码
KBDownequ50H;↓键扫描码
;-------------------------------------
;定义结构类型
Words_TableStruc;单词链表
Recognisedb?
;识别标志(是否认识这个单词)
previousdw?
;前一个节点地址
Nextdw?
;下一个节点地址
Words_TableEndS
;-------------------------------------
Prompt_Str1db'Pleaseinputwords:
',13,10,'$';“请输入单词”提示信息
Prompt_Str2db'doyouknowit?
(y/n):
$';“是否认识单词”提示信息
Prompt_Str3db7,13,10,13,10,'youranswerrateis:
$';“单词识别率”提示信息
Prompt_Str4db7,13,10,13,10,'Doyouwanttotestagain(y/n)?
$';“测试下一组单词?
”提示信息
Wordsdb0;实际输入的单词数目
Press_Keydb7,13,10,13,10,'Thecomplated.Pressanykeytoexit...$';操作完成按任意键结束程序提示信息
Start:
pushcs
popds
pushcs
popes;使数据段、附加段与代码段同段
InputWord:
callInput_Words;输入一组单词
callTest_Words;测试识别率
callStatics_Words;计算单词识别率
OutputPrompt_Str4;再测试一组单词?
callYes_or_No
callOutput_CTLF
callOutput_CTLF
jcInputWord
;-------------------------------------
Exit_Proc:
OutputPress_Key;提示操作完成,按任意键结束程序
movah,1
int21h
movah,4ch;结束程序
int21h
Buffer:
;数据缓冲区
CodeENDS
ENDStart;编译到此结束
1. 实现单词的录入(为使程序具有可演示性,单词不少于10个)。
2. 单词根据按键控制依次在屏幕上显示,按键选择认识还是不认识,也可以直接进入下一个或者上一个。
3. 单词背完后给出正确率。
CodeSegment
AssumeCS:
Code,DS:
Code
;-------------------------------------
OutputMACROStr_Addr
pushax
leadx,Str_Addr
movah,9
int21h
popax
EndM
;-------------------------------------
Output_ChrprocNear
pushax
movah,02h
int21h
popax
ret
Output_Chrendp
;-------------------------------------
Output_CTLFprocNear
pushax
pushdx
movah,02h
movdl,0dh
int21h
movdl,0ah
int21h
popdx
popax
ret
Output_CTLFendp
;-------------------------------------
;
Dec_ASCIIProcNear
pushdx
pushbx
pushdi
movbx,10
leadi,Temp_Save[6]
movBYTEptr[di],'$'
decdi
Divide:
xordx,dx
divbx
ordl,30h
mov[di],dl
decdi
testax,0ffffh
jnzDivide
incdi
pushdi
popdx
movah,9
int21h
popdi
popbx
popdx
ret
Temp_Savedb7dup(?
)
Dec_ASCIIEndP
;-------------------------------------
;功能:
键盘输入一个字符,若输入的是'y'或'n'(不分大小写),则显示并返回
;入口:
无
;出口:
若输入的是'y',进位标志置位;若输入的是'n',进位标志复位。
Yes_or_NoprocNear
pushdx
pushax
Input_Chr:
movah,7;不带回显的键盘输入
int21h
movdl,al
andal,0dfh
cmpal,'Y'
jnz$+5
stc
jmp$+7
cmpal,'N'
jnzInput_Chr
clc
movah,2
int21h
popax
popdx
ret
Yes_or_NoEndp
;-------------------------------------
Input_WordsProcNear;输入一组单词
xorcl,cl;输入的单词数目初值
leabx,Buffer;数据缓冲区地址
movdi,bx
OutputPrompt_Str1;提示输入单词
Input_Words:
cmpcl,255
jzTermanate;限定最多255个单词
mov[bx.Recognise],No;初始化识别标志
mov[bx.previous],di;前一个节点地址
mov[bx.Next],Chrs+1;每个单词最多字符数
movdi,bx
leadx,[bx.Next];键盘输入缓冲区地址
movah,0ah;输入单词
int21h
movsi,dx
incsi
lodsb;读入实际输入的字符个数,即单词长度
testal,al;直接回车?
jzTermanate;是,结束单词输入
inccl;累计输入的单词数目
xorah,ah
addsi,ax
mov[si],'$';使之能用dos功能调用9号功能显示这个字符串(单词)
incsi
mov[bx.Next],si;下一个节点地址
movbx,si
callOutput_CTLF;输出一个回车、换行
jmpInput_Words;输入下一个单词
Termanate:
cmpcl,10
jbInput_Words;限定最少5个单词
movWords,cl;保存单词数目
leasi,Buffer;数据缓冲区地址
movbx,[bx.previous]
mov[si.previous],bx;把第一个节点的前一个节点地址指向最后一个节点
mov[bx.Next],si;把最后一个节点的下一个节点地址指向第一个节点,形成循环链表
callOutput_CTLF
ret
Input_WordsEndP
;-------------------------------------
Test_WordsProcNear
callOutput_CTLF
callOutput_CTLF
leadx,[si.Next][2]
movah,9
int21h
callOutput_CTLF
OutputPrompt_Str2;要求回答是否认识这个词汇,回答字母不分大小写
Recognise:
or[si.Recognise],Yes
callYes_or_No
jcUp_Down
and[si.Recognise],No
Up_Down:
xorah,ah
int16h
cmpah,KBEsc
jnz$+3
ret
cmpah,KBUp
jnzNext_KBDown
movsi,[si.previous]
jmpTest_Words
Next_KBDown:
cmpah,KBDown
jnzUp_Down
movsi,[si.Next]
jmpTest_Words
Test_WordsEndP
;-------------------------------------
Statics_WordsProcNear;计算单词识别率
movcl,Words;取单词数
xorch,ch
leasi,Buffer;数据缓冲区地址
movbx,[si.Next]
xorax,ax
L0:
addal,[si.Recognise];累加识别率
movsi,[si.Next]
loopL0
movbl,100
mulbl
divWords
OutputPrompt_Str3;提示显示单词识别率
callDec_ASCII;把AX中的二进制无符号数转换成显式的十进制ASCII码,并送显示屏显示
movdl,'%'
callOutput_Chr;显示输出一个字符
ret
Statics_WordsEndP
;-------------------------------------
Chrsequ20;单词最多字符数
Yesequ1;认识
Noequ0;不认识
KBEscequ1;Esc键扫描码
KBUpequ48H;↑键扫描码
KBDownequ50H;↓键扫描码
;-------------------------------------
;定义结构类型
Words_TableStruc;单词链表
Recognisedb?
;识别标志(是否认识这个单词)
previousdw?
;前一个节点地址
Nextdw?
;下一个节点地址
Words_TableEndS
;-------------------------------------
Prompt_Str1db'Pleaseinputwords:
',13,10,'$';“请输入单词”提示信息
Prompt_Str2db'doyouknowit?
(y/n):
$';“是否认识单词”提示信息
Prompt_Str3db7,13,10,13,10,'youranswerrateis:
$';“单词识别率”提示信息
Prompt_Str4db7,13,10,13,10,'Doyouwanttotestagain(y/n)?
$';“测试下一组单词?
”提示信息
Wordsdb0;实际输入的单词数目
Press_Keydb7,13,10,13,10,'Thecomplated.Pressanykeytoexit...$';操作完成按任意键结束程序提示信息
Start:
pushcs
popds
pushcs
popes;使数据段、附加段与代码段同段
InputWord:
callInput_Words;输入一组单词
callTest_Words;测试识别率
callStatics_Words;计算单词识别率
OutputPrompt_Str4;再测试一组单词?
callYes_or_No
callOutput_CTLF
callOutput_CTLF
jcInputWord
;-------------------------------------
Exit_Proc:
OutputPress_Key;提示操作完成,按任意键结束程序
movah,1
int21h
movah,4ch;结束程序
int21h
Buffer:
;数据缓冲区
CodeENDS
ENDStart;编译到此结束