x86 assembly - masm32: Issues with pushing variable to stack
Asked Answered
F

2

1

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?

Frigidarium answered 21/5, 2012 at 1:12 Comment(0)
W
3
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
Workhorse answered 21/5, 2012 at 1:29 Comment(0)
D
1

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.

Durden answered 21/5, 2012 at 1:18 Comment(2)
I now tried to move the variable to EAX and now I am getting invalid instruction operands using this code: mov eax, num1 ; the variable is num1. Why is this?Frigidarium
You can push a byte or (d/q)word as a number (immediate operand) and the latter naturally is a sequence of bytes.Crossly

© 2022 - 2024 — McMap. All rights reserved.