views:

237

answers:

2

I really do not understand why this simple code works fine in the first attempt but when putting it in a procedure an error shows:

NTVDM CPU has encountered an illegal instruction CS:db22 IP:4de4 OP:f0 ff ff ff ff

The first code segment works just fine:

.model small
.stack 100h
.code

start:
  mov ax,@data
  mov ds,ax
  mov es,ax

   MOV AH,02H    ;sets cursor up            
   MOV BH,00H
   MOV DH,02
   MOV DL,00
   INT 10H

EXIT:

MOV AH,4CH
INT 21H
END

However This generates an error:

.model small
.stack 100h
.code

start:
  mov ax,@data
  mov ds,ax
  mov es,ax

  call set_cursor

  PROC set_cursor near

  MOV AH,02H    ;sets cursor up             
  MOV BH,00H
  MOV DH,02
  MOV DL,00
  INT 10H
 RET
 set_cursor ENDP

EXIT:

  MOV AH,4CH
  INT 21H
  END

Note: Nothing is wrong with windows config. I have tried many sample codes that work fine

Thanks

+7  A: 

You left out a JMP:

call set_cursor
jmp EXIT ; <== you forgot this part

PROC set_cursor near

What's happening is that after call set_cursor, you're then falling through to the proc and and executing it again, then when you hit the ret it pops the stack and you jump to, well, who knows?

Edit: As someone else pointed out, you're better off putting your PROC after your main code ends, instead of sticking it in the middle and jumping around it. But you've probably figured that out already :)

egrunin
stupid me...thanks a lot i didn't notice the missing jump
Natasha
My assembly professor always called it "Lala Land". The magical place that the PC jumps to when you don't have a specific return address.
Vivin Paliath
lol , i guess i missed i LALA LAND
Natasha
No need to thank me, just 'accept' the answer :)
egrunin
+2  A: 

You should move the code of the procedure after the part where you exit the program (or follow egrunin's advice).

The reason for your segfault is that the code in the procedure is executed again after you first call it. During the second execution the code crashes on RET because there is no valid return address on the stack.

edgar.holleis