Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

operation size not specified

I have a problem with 32bit Assembly, assembling it with NASM on linux. Here is my implementation of insertion sort

myInsertionSort:
push ebp
mov ebp, esp
push ebx
push esi
push edi
mov ecx, [ebp+12]   ;put len in ecx, our loop variable
mov eax, 1 ; size of one spot in array, one byte
mov ebx, 0
mov esi, [ebp+8] ; the array
loop loop_1
loop_1:
    cmp eax, ecx ; if we're done
    jge done_1 ; then done with loop
    push ecx ; we save len, because loop command decrements ecx
    mov ecx, [esi+eax] ; ecx now array[i]
    mov ebx, eax
    dec ebx ; ebx is now eax-1, number of times we should go through inner loop
    loop_2:
        cmp ebx, 0 ; we don't use loop to not affect ecx so we use ebx and compare it manually with 0
        jl done_2
        cmp [esi+ebx], ecx ;we see if array[ebx] os ecx so we can exit the loop
        jle done_2
        mov edx, esi
        add edx, ebx
        push [edx] ; pushing our array[ebx] *****************************
        add edx, eax
        pop [edx] ; poping the last one *********************************
        dec ebx ; decrementing the loop iterator
        jmp loop_2 ; looping again
    done_2:
        mov [esi+ebx+1], ecx
        inc eax ; incrementing iterator
        pop ecx ; len of array to compare now to eax and see if we're done
        jmp loop_1
done_1:
    pop edi
    pop esi
    pop ebx
    pop ebp ; we pop them in opposite to how we pushed (opposite order, it's the stack, LIFO)
    ret

Now... When I try to compile my code with nasm, I get errors of "operation size not specified" on the lines containing asterisks in the comments :P It's basic insertion sort and I'm not sure what could have gone wrong. Enlighten me, please.

like image 831
Jack Avatar asked Apr 30 '26 08:04

Jack


1 Answers

The data at [edx] could be anything, so its size is unknown to the assembler. You'll have to specify the size of the data you want to push/pop. For example, if you want to push/pop a dword (32 bits) you'd write:

push dword [edx]
pop dword [edx]

By the way, you can combine these lines:

mov edx, esi
add edx, ebx

into:

lea edx,[esi + ebx]
like image 167
Michael Avatar answered May 02 '26 21:05

Michael