1

2 つの入力数値を取得し、乗算 (結果を変数に格納)、除算 (結果を別の変数に格納)、および結果を出力するプログラムを作成しようとしています。

私が抱えている問題は、コードの最初の行が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. 

なぜこのエラーが発生するのですか?

4

2 に答える 2

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
于 2012-05-21T01:29:00.600 に答える
1

エラー メッセージは非常に明確で、オペランドが無効です。あなたはこれを行うことはできません:

push num1

オペコード「プッシュ」は有効ですが、x86 命令セットでは、バイト シーケンス (文字列) ではなく、特定のレジスタのみをプッシュできます。あなたの num1 はバイトシーケンスです。

例えば:

push ax

有効な命令と有効なオペランドです。

プッシュできる有効なレジスタの例: AH、AL、BH、BL、CH、CL、DH、DL、AX、BX、CX、DX など。

于 2012-05-21T01:18:32.917 に答える