2012-05-21 2 views
1

Я пытаюсь создать программу, которая получает два входных числа, умножает их (сохраняя результат в переменной), делит их (сохраняя результат в другой переменной) и печатает результат.x86 assembly - masm32: проблемы с нажатием переменной в стек

Проблема у меня в том, что в первой строке кода push num1 возвращается 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. 

Почему это вызывает эту ошибку?

ответ

2
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 
+0

Спасибо Gunner, работает! – Progrmr

1

Сообщение об ошибке очень ясно, операнд недействителен. Вы не можете сделать это:

push num1 

Опкод «толчок» является действительным, но в наборе команд x86, вы можете нажать только определенные регистры, а не последовательность байт (строка). Ваш num1 является байтовой последовательностью.

Например:

push ax 

является действительным инструкция и действительные операнды.

Пример допустимых регистров, которые вы можете нажать: AH, AL, BH, BL, CH, CL, DH, DL, AX, BX, CX, DX и т.д.

+0

теперь я пытался двигаться переменная в EAX, и теперь я получаю 'недопустимые операнды команд', используя этот код:' mov eax, num1; переменная num1'. Почему это? – Progrmr

+0

Вы можете нажимать байтовое или (d/q) слово как число (непосредственный операнд), а последний, естественно, представляет собой последовательность байтов. –

 Смежные вопросы

  • Нет связанных вопросов^_^