assume cs:code,ds:date date segment db 0,0,0,0 ;随机数位置 db 0,0,0,0 ;输入数位置 db 0,0 ;a与b的数值 db 0,0 ;错误次数与随机数完成数 db ' the ' ;待输出数据 date ends code segment start: mov ax,date mov ds,ax ;ds指向date mov ax,0b800h mov es,ax ;es指向显存 mov cx,9 do: call press ;完成输入及产生随机数 inc byte ptr ds:[10] call check ;确定AB值并输出信息 cmp al,1 ;为1表示完全猜对了 je tuichu loop do ;猜9次 tuichu: mov ax,4c00h int 21h ;------------------------------------------------------------------- press: push ax press_re: mov ah,0 int 16h ;等待按键 cmp byte ptr ds:[11],4 je press_man ;检测随机数是否为满 call creatsuiji ;生成随机数 press_man: call checkpress ;检查按键是啥并处理 cmp al,0 je press_re ;如果=0就要重新输入 pop ax ret ;38行 ;--------------------------------------------------------------- creatsuiji: ;子程序功能:生成随机数 push ax push bx push cx push dx push di creatsuiji_re: mov ah,0 int 1ah mov dh,0 mov ax,dx mov dl,10 div dl add ah,30h ;得到随机数 存于ah,和dh mov dh,ah mov al,0 call checknumber ; cmp ax,0ffh je creatsuiji_re mov di,ax mov ds:[di],dh inc byte ptr ds:[11] pop di pop dx pop cx pop bx pop ax ret ;66 ;-------------------------------------------------------------------- checknumber: ;检查是否重复,入口al,ah数字,出口ax push di push cx cmp al,0 je checknumber_suiji mov di,4 jmp checknumber_shuru checknumber_suiji: mov di,0 checknumber_shuru: mov cx,4 ;检测四次 checknumber_re: cmp byte ptr ds:[di],0 je checknumber_yes cmp ds:[di],ah je checknumber_no inc di loop checknumber_re checknumber_yes: mov ax,di pop cx pop di ret checknumber_no: mov ax,0ffh pop cx pop di ret ;---------------------------------------------------------------------- checkpress: ;入口参数ax,为扫描码和ASCII,出口参数al cmp ah,4bh je checkpress_leftright cmp ah,4dh je checkpress_leftright ;除了回车并确定完事后,其余全返回0,就是让再次输入 cmp ah,1ch je checkpress_enterr cmp al,30h jb checkpress_other cmp al,39h ja checkpress_other jmp checkpress_number checkpress_other: mov al,0 ret checkpress_leftright: call leftright mov al,0 ret checkpress_enterr: call enterr ret checkpress_number: call number mov al,0 ret ;----------------------------------------------------------- leftright: ;输入左右时的处理程序 push ax push bx push cx push dx cmp ah,4bh je leftright_left jmp leftright_right leftright_left: mov ah,3 int 10h cmp dl,0 je leftright_ret sub dl,1 jmp leftright_ret leftright_right: mov ah,3 int 10h cmp dl,3 je leftright_ret add dl,1 leftright_ret: mov ah,2 int 10h pop dx pop cx pop bx pop ax ret ;----------------------------------------------------------- enterr: ;入口参数ax,返回al push bx mov bx,7 cmp byte ptr ds:[bx],0 je enterr_no mov al,1 jmp enterr_ret enterr_no: mov al,0 enterr_ret: pop bx ret ;----------------------------------------------------------- number: ;入口参数ax push ax push bx push cx push dx push di mov ch,al ;原值在al中.现在在ch中 mov al,1 mov ah,ch call checknumber cmp ax,0ffh je number_ret ;往下为输入的数字正确时# push cx mov ah,3 int 10h add dl,4 mov dh,0 pop cx ;得到列号加4 mov di,dx mov ds:[di],ch ;将光标位置修改的数据写入记录区 mov al,ch mov cx,1 mov bh,0 mov ah,0ah int 10h ;写当前光标位置 mov ah,4dh call leftright ;模拟按右键 number_ret: pop di pop dx pop cx pop bx pop ax ret ;------------------------------------------------------------ check: push bx push cx push dx push di mov bx,0 mov ah,8 int 10h mov ah,0eh int 10h ;右移光标 mov ah,0eh mov di,12 mov cx,5 has: mov al,ds:[di] int 10h inc di loop has ;显示' the ' mov al,ds:[10] add al,30h int 10h ;显示错误次数 call huanhang mov di,4 mov cx,4 ;ds:[di]指向输入数字,ds:[si]指向随机数 check_do: mov al,ds:[di] cmp ds:[di-4],al je check_a ;位数和数字都等的话跳到加a push cx ;内循环,把cx压栈 mov bx,0 mov cx,4 check_do1: cmp ds:[bx],al je check_b inc bx loop check_do1 pop cx jmp check_do_loop check_a: inc byte ptr ds:[8] jmp check_do_loop check_b: inc byte ptr ds:[9] pop cx check_do_loop: inc di loop check_do call showab mov al,0 cmp byte ptr ds:[8],4 jne check_ret mov al,1 check_ret: call huanhang mov cx,6 mov di,4 check_clear: mov byte ptr ds:[di],0 inc di loop check_clear pop di pop dx pop cx pop bx ret ;-------------------------------- showab: push ax push bx push cx mov al,ds:[8] add al,30h mov bx,0 mov ah,0eh int 10h mov al,'A' int 10h mov al,ds:[9] add al,30h int 10h mov al,'B' int 10h pop cx pop bx pop ax ret ;---------------------------------- huanhang: mov ah,3 int 10h inc dh mov dl,0 mov ah,2 int 10h ;换行 ret code ends end start