枚举型enum汇编解释

枚举型本质是整型,只是以字符串的形式组成便于理解。

我们可以认为 enum Op=int=Opr,

而枚举成员可以认为是int型的变量,

例如typedef enum Op{ADD,SUB,MUL,DIV,MOD,MAX} Opr;

可以等价为 int ADD=0,SUB=1,MUL=2,DIV=3,MOD=4,MAX=5。

#include<stdio.h>

typedef enum Op{ADD,SUB,MUL,DIV,MOD,MAX} Opr;

int compu(int x,int y,enum Op op){
    if(op==ADD) return x+y;
    if(op==SUB) return x-y;
    if(op==MUL) return x*y;
    if(op==DIV) return x/y;
    if(op==MOD) return x%y;
    if(op==MAX) return x>y?x:y;
    printf("Illegal operator.\n");
    return 0;
}

int main(){
    enum Op opr=MUL;
    printf("%d\n",compu(2,5,opr));
    printf("%d\n",compu(3,6,MOD));
    printf("%d\n",compu(6,7,19));
    printf("%d\n",compu(-5,7,5));
    Opr opr1=SUB;
    printf("%d\n",compu(4,3,opr1));
    opr1=3;
    printf("%d\n",compu(8,3,opr1));
}

对应汇编代码如下:

.LC0:
        .string "Illegal operator."
compu:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     DWORD PTR [rbp-4], edi
        mov     DWORD PTR [rbp-8], esi
        mov     DWORD PTR [rbp-12], edx
        cmp     DWORD PTR [rbp-12], 0
        jne     .L2
        mov     edx, DWORD PTR [rbp-4]
        mov     eax, DWORD PTR [rbp-8]
        add     eax, edx
        jmp     .L3
.L2:
        cmp     DWORD PTR [rbp-12], 1
        jne     .L4
        mov     eax, DWORD PTR [rbp-4]
        sub     eax, DWORD PTR [rbp-8]
        jmp     .L3
.L4:
        cmp     DWORD PTR [rbp-12], 2
        jne     .L5
        mov     eax, DWORD PTR [rbp-4]
        imul    eax, DWORD PTR [rbp-8]
        jmp     .L3
.L5:
        cmp     DWORD PTR [rbp-12], 3
        jne     .L6
        mov     eax, DWORD PTR [rbp-4]
        cdq
        idiv    DWORD PTR [rbp-8]
        jmp     .L3
.L6:
        cmp     DWORD PTR [rbp-12], 4
        jne     .L7
        mov     eax, DWORD PTR [rbp-4]
        cdq
        idiv    DWORD PTR [rbp-8]
        mov     eax, edx
        jmp     .L3
.L7:
        cmp     DWORD PTR [rbp-12], 5
        jne     .L8
        mov     edx, DWORD PTR [rbp-8]
        mov     eax, DWORD PTR [rbp-4]
        cmp     edx, eax
        cmovge  eax, edx
        jmp     .L3
.L8:
        mov     edi, OFFSET FLAT:.LC0
        call    puts
        mov     eax, 0
.L3:
        leave
        ret
.LC1:
        .string "%d\n"
main:
        push    rbp
        mov     rbp, rsp
        sub     rsp, 16
        mov     DWORD PTR [rbp-4], 2
        mov     eax, DWORD PTR [rbp-4]
        mov     edx, eax
        mov     esi, 5
        mov     edi, 2
        call    compu
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC1
        mov     eax, 0
        call    printf
        mov     edx, 4
        mov     esi, 6
        mov     edi, 3
        call    compu
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC1
        mov     eax, 0
        call    printf
        mov     edx, 19
        mov     esi, 7
        mov     edi, 6
        call    compu
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC1
        mov     eax, 0
        call    printf
        mov     edx, 5
        mov     esi, 7
        mov     edi, -5
        call    compu
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC1
        mov     eax, 0
        call    printf
        mov     DWORD PTR [rbp-8], 1
        mov     eax, DWORD PTR [rbp-8]
        mov     edx, eax
        mov     esi, 3
        mov     edi, 4
        call    compu
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC1
        mov     eax, 0
        call    printf
        mov     DWORD PTR [rbp-8], 3
        mov     eax, DWORD PTR [rbp-8]
        mov     edx, eax
        mov     esi, 3
        mov     edi, 8
        call    compu
        mov     esi, eax
        mov     edi, OFFSET FLAT:.LC1
        mov     eax, 0
        call    printf
        mov     eax, 0
        leave
        ret

可以看出枚举型变量最终都被编译成了数字,也就是整型。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

HsiaoShawn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值