CodeGuru Home VC++ / MFC / C++ .NET / C# Visual Basic VB Forums Developer.com
Results 1 to 2 of 2
  1. #1
    Join Date
    Dec 2008
    Posts
    2

    Exclamation Procedure size? Need halp

    so I have this working procedure that is basically like function 09h of int 21h except it terminates at 00h, and it uses 01h-04h as control characters that determine the style of the text.

    I wrote it in the main procedure of a test program to get it working, and then I put it in its own procedure in a larger program. When I run it from the larger program, I get this error:

    "title: 16 bit MS-DOS Subsystem

    Command Prompt - cmp
    NTVDM has encountered a System Error
    Access is denied.
    Choose 'Close' to terminate the application
    Close | Ignore"

    I can't really ignore it. Anyways, I narrowed the cause of this error down to a procedure without a "RET" statement. But it has a return statement at the end. If I just put RET in the procedure, it runs, if I put all of the code back into the test program (main procedure), it runs. So I'm thinking maybe there's a maximum size for a procedure that is called? It is quite long, I haven't tried to slim it down at all, I'm not sure if I really can. Anyway, here's the procedure:

    Code:
    outp proc
    		
    	push cx
    	push bx
    	xor cx,cx
    	xor bx,bx
    nexch:  mov si,dx
    	push dx
    	add si,cx
    	push cx
    	mov al,[si]
    	cmp al,00h
    	jnz nndpr
    	jmp endpr
    nndpr:  cmp al,0dh				;LINE FEED
    	jnz not0d
    	mov ah,03h
    	int 10h
    	cmp dh,24d
    	jz scwin
    	inc dh
    	mov ah,02h
    	int 10h
    	jmp gnext
    scwin:  mov ax,0601h
    	xor cx,cx
    	mov dh,24d
    	mov dl,79d
    	mov bl,attrWHT
    	int 10h
    	jmp gnext
    not0d:  cmp al,0ah				;CARRIAGE RETURN
    	jnz not0a
    	mov ah,03h
    	int 10h
    	mov dl,00h
    	mov ah,02h
    	int 10h
    	jmp gnext
    not0a:  cmp al,01h				;WHITE
    	jnz not01
    	mov bl,attrWHT
    	mov attrCUR,bl
    	jmp gnext
    not01:  cmp al,02h				;GREEN
    	jnz not02
    	mov bl,attrGRN
    	mov attrCUR,bl
    	jmp gnext
    not02:  cmp al,03h				;YELLOW
    	jnz not03
    	mov bl,attrHLT
    	mov attrCUR,bl
    	jmp gnext
    not03:  cmp al,04h				;EDIT/HEADER
    	jnz not04
    	mov bl,attrEDT
    	mov attrCUR,bl
    	jmp gnext
    not04:  mov ah,09h
    	mov bl,attrCUR
    	mov cx,01h
    	int 10h
    	mov ah,03h
    	int 10h
    	inc dl
    	mov ah,02h
    	int 10h
    gnext:  pop cx
    	pop dx
    	inc cx
    	jmp nexch
    endpr:	pop bx
    	pop cx
    	ret
    I'm using TASM, and the model of the program is small... I tried making it "Large" and "Huge" to see how that would affect it but it said there was a problem with my call statement in the main procedure (Forward reference needs override). Has anyone run into something similar to this? How can I fix it and make it work?

    Oh, and I tried doing something like this:

    Code:
    outp proc
    
    	jmp strprc
    endprc: ret
    strprc: ...
    	...
    	...
    	...
    	jmp endprc
    
    outp endp
    the procedure did its job but it wouldn't return afterward, the cursor just sat there blinking and I couldn't input anything (text, ctrl-c, etc)

  2. #2
    Join Date
    Dec 2008
    Posts
    2

    Re: Procedure size? Need halp

    so I figured out if I pop the stack into ax at the very beginning of the procedure (the return pointer), move that value into a variable I have saved, then push it back, then at the end of the procedure, move the variable into ax and push it again, then it will return properly, so I suppose I'm just not unwinding the stack correctly... Still I wonder why access to the procedure is denied if the RET statement is too far away? I'd like to just put it at the end and save all those unnecessary jumps

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •  





Click Here to Expand Forum to Full Width

Featured