operation size not specified
11,249
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]
Author by
Jack
Updated on June 05, 2022Comments
-
Jack almost 2 years
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.