簡體   English   中英

嵌入在C中的匯編代碼為cmp提供了錯誤的操作數類型錯誤

[英]assembly code embedded in c giving a improper operand type error for cmp

我制作了一個程序,該程序應檢查數字是正數,負數還是零。 當我嘗試編譯代碼時,對於第28行(即cmp操作碼),它給出了不正確的操作數類型錯誤。 我格式化錯誤,還是這里還有其他問題?

#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);
}

cmp指令的第一個操作數必須是寄存器或存儲器位置,而不是立即數。 您需要使用cmp eax, 0而不是cmp eax, 0 這也將與您的條件跳轉一致(如果eax為負,則jl會跳轉,等等)。

您可能會使Intel匯編語法(您使用過的)與AT&T語法混淆,在AT&T語法中,操作數的順序相反。

另外,您對ret的使用是不正確的: ret用於從函數返回,但是這里沒有函數調用。 您需要的是mov output, ebx行的jmp

您不能將立即數作為cmp的第一個操作數。 您需要執行cmp eax, 0而不是cmp eax, 0

用於將寄存器與常量進行比較的cmp語法要求常量排在第二位。 所以cmp eax, 0應該沒問題。

有效組合為:

cmp reg, reg
cmp reg, mem
cmp mem, reg
cmp reg, const

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM