x86 assembly - masm32:将变量推送到堆栈的问题

时间:2012-05-21 01:12:03

标签: assembly input x86 masm 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 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

错误信息非常清楚,操作数无效。 你不能这样做:

push num1

操作码“push”有效,但在x86指令集中,您只能推送某些寄存器,而不是字节序列(字符串)。你的num1是一个字节序列。

例如:

push ax

是有效的指令和有效的操作数。

您可以推送的有效寄存器示例:AH,AL,BH,BL,CH,CL,DH,DL,AX,BX,CX,DX等