Reputation: 1621
I'm trying to make a program that gets two input numbers, multiplies them (storing the result in a variable), divides them (storing the result in another variable) and prints the result.
The issue I'm having is that the first line of code push num1
returns invalid instruction operands
:
.data
num1 db "Enter a number:"
num2 db "Enter another number:"
.data?
buffer1 dd 100 dup(?) ; this is where I store input for num1
buffer2 dd 100 dup(?) ; " " num2
.code
start:
push num1 ; here is where it returns the error
call StdOut ;I want to print num1 but it doesn't get that far.
; later on in my code it does multiplication and division.
push buffer1 ; I push buffer1
call StdIn ; so that I can use it for StdIn
; I repeat this for num2
; I then use those 2 numbers for multiplication and division.
Why is it causing this error?
Upvotes: 1
Views: 3165
Reputation: 5884
start:
push offset num1
call Stdout
; or
lea eax, num1
call StdOut
;this:
push num1
; is pushing the letter 'E' I believe.
; here is where it returns the error
call StdOut
; this is wrong also:
push buffer1 ; I push buffer1 <<< no, you are trying to push the val of buffer1
call StdIn ; so that I can use it for StdIn
; you need to pass an address of the label (variable)
; so either
lea eax, buffer1
push eax
call StdIn
; or
push offset buffer1
call StdIn
Upvotes: 3
Reputation: 1712
The error message is very clear, the operand is invalid. You can't do this:
push num1
The opcode "push" is valid, but in x86 instruction set, you can only push certain registers, not a byte sequence (string). Your num1 is a byte sequence.
For example:
push ax
is a valid instruction and valid operands.
Sample of valid registers that you can push: AH, AL, BH, BL, CH, CL, DH, DL, AX, BX, CX, DX, etc.
Upvotes: 1