1

数値が正か負かゼロかをチェックするプログラムを作成しました。コードをコンパイルしようとすると、cmp オペコードである 28 行目で不適切なオペランド タイプ エラーが発生します。フォーマットが間違っていますか、それとも他の問題がありますか?

#include <stdio.h>

int input;
int output;


int main (void)
{
       scanf("%d", &input);

__asm
{
    jmp start

negative:   
    mov ebx, -1
    ret
nuetral:
    mov ebx, 0
    ret
positive:
    mov ebx, 1
    ret

start:
    mov eax, input
    mov ebx, other

    cmp 0, eax

    jl negative
    je neutral
    jg positive

    mov output, ebx

}
printf("%d\n", output);
}
4

3 に答える 3

3

命令の最初のオペランドはcmp、即値ではなく、レジスタまたはメモリ位置でなければなりません。cmp eax, 0代わりに使用する必要があります。これは、条件付きジャンプとも一致します(が負のjl場合にジャンプするeaxなど)。

Intel アセンブリ構文 (使用したもの) と、オペランドの順序が逆になっている AT&T 構文を混同している可能性があります。

さらに、 の使用法retが正しくありません:retは関数から戻るために使用されますが、ここには関数呼び出しはありません。あなたがそこに必要なものはjmpmov output, ebxラインへです。

于 2011-09-14T15:05:54.070 に答える
1

の最初のオペランドとして即値を指定することはできませんcmpcmp eax, 0代わりに行う必要があります。

于 2011-09-14T15:06:30.060 に答える
1

レジスタを定数と比較するための cmp の構文では、定数が 2 番目に来る必要があります。それでcmp eax, 0いいはずです。

有効な組み合わせは次のとおりです。

cmp reg, reg
cmp reg, mem
cmp mem, reg
cmp reg, const
于 2011-09-14T15:07:18.373 に答える