My program was working fine and executing, now all of a sudden I get a unhandled exception which forces me to break and then it says frame not in module?
"The current stack frame was not found in a loaded module. Source cannot bee shown for this location"
TITLE Sort array (Array.asm)
; This program sorts an array with random integers
; and outputs them in order
INCLUDE Irvine32.inc ; new
includelib C:\Irvine\Kernel32
includelib C:\Irvine\User32
includelib C:\Irvine\Irvine32
.data
array BYTE 20, 10, 60, 5, 120, 90, 100 ; array with 7 values
arraysize = ($ - array) -1 ; size of array
.code
main PROC
call SortArray ; call function to sort
call ShowArray ; call function to show
call DumpRegs ; display the registers
call WaitMsg ; Pause until a key is pressed
exit
main ENDP
SortArray PROC
mov esi, OFFSET array
mov ecx, arraysize;
L1:
push ecx
mov edi, esi ; use seond pointer
mov eax,[esi]
L2:
inc edi
CMP eax, [edi]; compare second value with previous
JGE exchg ; perform exchange
JLE dntxchg ; dont perform exchange
inc esi
pop ecx
loop L1
dntxchg:
loop L2 ; start loop again
exchg:
mov eax, [edi]
xchg [esi],eax
mov [edi], eax
loop L2 ;
ret
SortArray ENDP
ShowArray PROC
;show contents of array
mov esi, OFFSET array
mov ecx, arraysize
inc ecx
L3:
mov ebx, TYPE array
call DumpMem
loop L3
ret
ShowArray EndP
END main
alright so the last 3 lines of the following code are never executed (Do you understand why ?) and thus you will only loop in L2. And in L2 you are popping and popping lots of values from the stack but since L1 isn't repeated no values or pushed onto the stack. This makes the program crash obviously.
CMP eax, [edi]; compare second value with previous
JGE exchg ; perform exchange
JLE dntxchg ; dont perform exchange
inc esi
pop ecx
loop L1
I do see an imbalance in the stack, in the sort function
all is well until you branch
then, the stack becomes unbalanced due to a PUSH ECX without a corresponding POP
it may be that you PUSH PUSH PUSH until the stack barks :shock:
or, it could be that it tries to RET to an address that isn't code inside your EXE
(I've never seen that specific error message - lol)
Ah yes I see, so how am I supposed to properly implement it?
Basically what I'm trying to do is:
Have esi point to the first element, whilst I use a second pointer which will keep pointing to the next element and comparing it to esi. Then, when edi reaches the last element, I want to increment esi so it points to the second element, and then I use edi again to compare it with every other element
unfortunately, i don't have time to really dig into the code
but, offhand, i would try to do it without push and pop
you have 7 registers, including EBP
there's a good chance it could be written without push and pop :t
Quote from: arsenalftw067Have esi point to the first element, whilst I use a second pointer which will keep pointing to the next element and comparing it to esi.
The following code is not right. You want to move only the byte at esi into eax, not the next 4 bytes (dword).
;instead of
mov eax,[esi]
;do this (there are alternatives)
movzx eax,BYTE PTR [esi]
- That's assuming the byte values won't be negative; if they can be, use movsx.
instead of using edi you could compare to [esi+1]:
;instead of
CMP eax, [edi]; compare second value with previous
;you could use
CMP al, BYTE PTR [esi+1]; compare second value with previous
- It requires changing the looping and exchg code appropriately
- I should check this by running it but, hopefully you get the idea. Anyway, you have to fix the first problem. But you can continue to use edi; it "wastes" a register but, it does work