关于跳跃地址表的实现
程序代码:
DATAS SEGMENT table dw prog4,prog1,prog2,prog3,prog4 lat1 db 0ah,0dh,'(1) GUESS NUMBER GAME $' lat2 db 0ah,0dh,'(2) CHAR SELECTION PROGRAM $' lat3 db 0ah,0dh,'(3) PASSWORD PROGRAM $' lat4 db 0ah,0dh,'(4) PRESS "ESC" TO QUIT $' mess1 db 0ah,0dh,'input 1-4:$' mess2 db 0ah,0dh,'Your selection is 1,the program will execute GUESS NUMBER GAME!$' mess3 db 0ah,0dh,'Your selection is 2,the program will execute CHAR SELECTION PROGRAM!$' mess4 db 0ah,0dh,'Your selection is 3,the program will execute PASSWORD PROGRAM!$' mess5 db 0ah,0dh,'Your selection is 4,the program will execute PRESS "ESC" TO QUIT!$' mess6 db 0ah,0dh,'will you continue program really?(Y:N)$' mess7 db 0ah,0dh,'Please press ESC key to exit!$' M db '5' N db ? str11 db 0ah,0dh,'now please input a number: ','$' str12 db 'TOO BIG','$' str13 db 'TOO SMALL','$' str14 db 'YOUR ARE RIGHT','$' str21 db 0ah,0dh,'you can input "<CR>" to go out,if you want go on ,please input others besides "<CR>" $' str22 db 0ah,0dh,'you input:','$' str23 db 0ah,0dh,'IT IS A DIGITAL','$' str24 db 0ah,0dh,'IT IS A LOWCASE LETTER','$' str31 db '123' str32 db 0ah,0dh,'please input a string:','$' len equ str32-str31 str_d db 50,?,50 dup(?) mess31 db 0ah,0dh,'MATCH!$' mess32 db 0ah,0dh,'NOMATCH!,PROGRAM TERMINATED!$' DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX push ax mas: lea dx,lat1 mov ah,09h int 21h lea dx,lat2 mov ah,09h int 21h lea dx,lat3 mov ah,09h int 21h lea dx,lat4 mov ah,09h int 21h mov dx,offset mess1 mov ah,09h int 21h mov ah,1 int 21h and al,03h mov ah,0 shl ax,1 mov bx,ax push bx to: jmp table[bx] prog1: mov dx,offset mess2 mov ah,09h int 21h mov bl,M mov dx,offset str11 mov ah,09h int 21h mov ah,01h int 21h mov N,al cmp bl,al jb a cmp bl,al ja b mov dl,0ah mov ah,02h int 21h mov dl,0dh int 21h mov dx,offset str14 mov ah,09h int 21h jmp let1 a: mov dl,0ah mov ah,02h int 21h mov dl,0dh int 21h mov dx,offset str13 mov ah,09h int 21h jmp let1 b: mov dl,0ah mov ah,02h int 21h mov dl,0dh int 21h mov dx,offset str12 mov ah,09h int 21h jmp let1 prog2: lea dx,mess3 mov ah,09h int 21h mov dx,offset str21 mov ah,09h int 21h mov dx,offset str22 mov ah,09h int 21h mov ah,01h int 21h cmp al,0dh jz exit cmp al,'1' jb another cmp al,'9' ja another mov dx,offset str23 mov ah,09h int 21h jmp let1 another: cmp al,'A' jb another2 cmp al,'Z' ja another2 mov dx,offset str24 mov ah,09h int 21h jmp let1 another2: cmp al,'a' jb another3 cmp al,'z' ja another3 mov dx,offset str24 mov ah,09h int 21h jmp let1 another3: jmp let1 prog3: lea dx,mess4 mov ah,09h int 21h mov dx,offset str32 mov ah,09h int 21h pop ax mov es,ax lea dx,str_d mov ah,0ah int 21h xor cx,cx mov cl,str_d+1 cmp cl,len jne ms lea si,str31 lea di,str_d+2 mad:mov al,ds:[si] mov bl,es:[di] cmp al,bl jne ms inc si inc di loop mad lea dx,mess31 mov ah,09h int 21h jmp let1 ms: lea dx,mess32 mov ah,09h int 21h let1: pop bx lea dx,mess6 mov ah,09h int 21h mov ah,01h int 21h cmp al,'Y' jz to cmp al,'N' jz mas prog4: lea dx,mess5 mov ah,09h int 21h lea dx,mess7 mov ah,09h int 21h mov ah,01h int 21h cmp al,27 jZ exit jmp mas exit: MOV AH,4CH INT 21H CODES ENDS END START在做第三个程序时,假设我输入‘123’,仍然得到的是nomatch