Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations SkipVought on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Help me out with this program please!

Status
Not open for further replies.

DoomMaster

Programmer
Mar 5, 2004
9
0
0
US
Hey guys, for some reason, the second scroll screen (to clear screen) crashes my program. I have run the executable through DEBUG to find the problem yet I was unable to find the problem. If someone would have the patience to look through my code and maybe help me out with the problem I would greatly appreciate it!

This is conventional 16Bit assembler code.

Code:
    PAGE    60,132
    TITLE   L11RCD (EXE)    LAB 11 PROG
;---------------------------------------------------------------------
STACK   SEGMENT PARA    STACK   'Stack'
        DB      32 DUP (0)
STACK   ENDS
;---------------------------------------------------------------------
DATASEG SEGMENT PARA    'Data'
INST    DB      '      THIS IS A TYPING TEST. ON THE NEXT SCREEN THERE WILL BE A SENTENCE',0DH,0AH
        DB      '      DISPLAYED AT THE TOP. YOU ARE TO TYPE THE SENTENCE EXACTLY AS IT IS',0DH,0AH
        DB      '      SHOWN, IN ITS ENTIRETY. IF YOU MAKE A MISTAKE YOUR TEST WILL BE',0DH,0AH
        DB      '      TERMINATED AND YOU WILL FAIL.',0DH,0AH,0AH
        DB      '      GOOD LUCK',0DH,0AH,0AH
        DB      '      PRESS ',027H,'ENTER',027H,' WHEN YOU ARE READY TO BEGIN THE TEST.$'
        
FAIL    DB      '      YOU HAVE FAILED THE TYPING TEST! PRESS ENTER TO TRY AGAIN, OR ESC TO EXIT$'

SUCES   DB      '      CONGRATULATIONS! YOU HAVE PASSED THE TEST!',0DH,0AH
        DB      '      PRESS ENTER TO TRY AGAIN, OR ESC TO EXIT$'
        
SENT    DB      15 DUP (020H),0DAH,44 DUP (0C4H),0BFH,0DH,0AH
        DB      15 DUP (020H),0B3H,'The quick brown fox jumps over the lazy dog.',0B3H,0DH,0AH
        DB      15 DUP (020H),0C0H,44 DUP (0C4H),0D9H,'$'
        
ANSW    DB      'The quick brown fox jumps over the lazy dog.'
ANSC    DB      0H
TEMP    DB      ?

DATASEG ENDS
;---------------------------------------------------------------------
;---------------------------------------------------------------------
CODESEG SEGMENT PARA    'Code'
MAIN    PROC    FAR
        ASSUME  SS:STACK,DS:DATASEG,CS:CODESEG
        MOV     AX,DATASEG
        MOV     DS,AX
        MOV     ES,AX

        MOV     AX,0003H
        INT     10H             ;SET RESOLUTION

        MOV     AH,02H
        MOV     BH,00H
        MOV     DH,08H
        MOV     DL,00H
        INT     10H             ;POSITION CURSOR FOR PROGRAM INSTRUCTIONS

        MOV     AH,09H
        LEA     DX,[INST]
        INT     21H             ;DISPLAY INSTRUCTIONS

        ;---------------
ENTERK: MOV     AH,10H
        INT     16H             ;REQUEST SINGLE INPUT

        CMP     AL,0DH          ;CHECK IF ENTER WAS PRESSED
        JNE     ENTERK               ;IF NOT, REQUEST INPUT UNTIL TRUE
        ;---------------

        MOV     AX,0700H
        MOV     CX,0000H
        MOV     BH,07H
        MOV     DX,184FH
        INT     10H             ;SCROLL SCREEN::CLEAR
        
        MOV     AH,02H
        MOV     BH,00H
        MOV     DH,05H
        MOV     DL,00H
        INT     10H             ;POSITION CURSOR FOR SENTENCE
        
        MOV     AH,09H
        LEA     DX,[SENT]
        INT     21H             ;DISPLAY SENTENCE TO TYPE
        
        MOV     AH,02H
        MOV     BH,00H
        MOV     DH,09H
        MOV     DL,10H
        INT     10H             ;POSITION CURSOR FOR INPUT
        
        MOV     BX,0H           ;SET STRING OFFSET COUNTER TO 0
        CALL    ILOOP
        
        MOV     AX,4C00H
        INT     21H
MAIN    ENDP
;---------------------------------------------------------------------
;   INPUT LOOP FOR SENTENCE
;---------------------------------------------------------------------
ILOOP   PROC    NEAR
        MOV     AH,0CH
        MOV     AL,01H
        INT     21H             ;REQUEST INPUT OF SINGLE CHARACTER
        MOV     TEMP,AL
        
        LEA     DI,[TEMP]
        LEA     SI,[ANSW+BX]    ;CHECK IF INPUT CHARACTER MATCHES THAT IN THE CORRECT SENTENCE
        CMPSB
        JNE     IERROR              ;IF NOT, THEN JUMP TO IERROR PROCEEDURE
        
        INC     BX              ;INCREMENT STRING OFFSET
        
        CMP     BX,02CH         ;CHECK IF END OF INPUT STRING
        JNE     ILOOP               ;IF NOT, THEN REPEAT THIS PROCEEDURE
        
        MOV     AX,0700H
        MOV     CX,0000H
        MOV     BH,07H
        MOV     DX,184FH
        INT     10H             ;SCROLL SCREEN::CLEAR
        
        MOV     AH,02H
        MOV     BH,00H
        MOV     DH,08H
        MOV     DL,00H
        INT     10H             ;POSITION CURSOR FOR SENTENCE
        
        MOV     AH,09H
        LEA     DX,[SUCES]
        INT     21H             ;DISPLAY SUCCESS MESSAGE
        
        MOV     AH,01H
        MOV     CX,0100H
        INT     10H             ;HIDE CURSOR
        
EXIT3:  MOV     AH,10H
        INT     16H             ;REQUEST SINGLE INPUT

        CMP     AL,0DH          ;CHECK IF ENTER WAS PRESSED
        JE      MAIN                ;IF TRUE, REPEAT ENTIRE PROGRAM
        CMP     AH,01BH         ;CHECK IF ESC KEY PRESSED
        JNE     EXIT3               ;IF FALSE, INPUT AGAIN UNTIL ENTER/ESC PRESSED
                
        MOV     AX,4C00H
        INT     21H             ;PROGRAM TERMINATION
ILOOP   ENDP
;---------------------------------------------------------------------
;   IF INPUT INCORRECT, THIS PROCEEDURE IS EXECUTED
;---------------------------------------------------------------------
IERROR  PROC    NEAR
        MOV     AX,0700H
        MOV     CX,0000H
        MOV     BH,07H
        MOV     DX,184FH
        INT     10H             ;SCROLL SCREEN::CLEAR
        
        MOV     AH,02H
        MOV     BH,00H
        MOV     DH,08H
        MOV     DL,00H
        INT     10H             ;POSITION CURSOR FOR SENTENCE
        
        MOV     AH,09H
        LEA     DX,[FAIL]
        INT     21H             ;DISPLAY FAILURE MESSAGE
        
        MOV     AH,01H
        MOV     CX,0100H
        INT     10H             ;HIDE CURSOR
        
EXIT1:  MOV     AH,10H
        INT     16H             ;REQUEST SINGLE INPUT

        CMP     AL,0DH          ;CHECK IF ENTER WAS PRESSED
        JE      MAIN                ;IF TRUE, REPEAT ENTIRE PROGRAM
        CMP     AH,01BH         ;CHECK IF ESC KEY WAS PRESSED
        JNE     EXIT1               ;IF NOT, REQUEST INPUT UNTIL ENTER OR ESC PRESSED
        
        MOV     AX,4C00H
        INT     21H             ;PROGRAM TERMINATION
IERROR  ENDP
;---------------------------------------------------------------------
CODESEG ENDS
        END     MAIN
 
From what I remember, I dont think you can 'jump' out of a procedure, you might need to 'return' instead. When you call a procedure, you put the return address on the stack, if you jump to instead of return, you're stack pointer gets messed up.

Thaz
 
You can jump out of a procedure but you will need to adjust the stack pointer accordingly. Especially if you don't return from it!
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top