分支语句

Tutorial: C与汇编 Category: C语言 Published: 2026-04-07 13:58:26 Views: 20 Likes: 0 Comments: 0
1. 分支语句
- 示例1
if (condition) {
    // 条件为真时执行的代码
}

- 示例2
if (condition) {
    // 条件为真时执行的代码
} else {
    // 条件为假时执行的代码
}

- 示例3
if (condition1) {
    // 条件1为真时执行的代码
} else if (condition2) {
    // 条件1为假且条件2为真时执行的代码
} else {
    // 所有条件均为假时执行的代码
}

- 示例4
switch (expression) {
    case constant1:
        // 当 expression 的值等于 constant1 时执行的代码
        break;
    case constant2:
        // 当 expression 的值等于 constant2 时执行的代码
        break;
    // 添加更多 case 作为需要
    ...
    default:
        // 当没有任何 case 匹配时执行的代码
}
2. 示例 3 汇编后
5:        int x = 1;
004109A8   mov         dword ptr [ebp-4],1
6:        int y = 2;
004109AF   mov         dword ptr [ebp-8],2
7:        int z;
8:
9:        if (x > y)
004109B6   mov         eax,dword ptr [ebp-4]
004109B9   cmp         eax,dword ptr [ebp-8]
004109BC   jle         main+36h (004109c6)    // 如果小于等于,则跳走
10:       {
11:           z = x;
004109BE   mov         ecx,dword ptr [ebp-4]
004109C1   mov         dword ptr [ebp-0Ch],ecx
12:       }
13:       else if (x == y)
004109C4   jmp         main+4Fh (004109df)
004109C6   mov         edx,dword ptr [ebp-4]
004109C9   cmp         edx,dword ptr [ebp-8]
004109CC   jne         main+46h (004109d6)   // 如果 不等于,则跳走,跳到小于
14:       {
15:           z = y;
004109CE   mov         eax,dword ptr [ebp-8]
004109D1   mov         dword ptr [ebp-0Ch],eax
16:       }
17:       else
004109D4   jmp         main+4Fh (004109df)
18:       {
19:           z = x + y;
004109D6   mov         ecx,dword ptr [ebp-4]
004109D9   add         ecx,dword ptr [ebp-8]
004109DC   mov         dword ptr [ebp-0Ch],ecx
20:       }

3. switch 语句
  • 源码
#include <stdio.h>

int main() {
    char grade;

    printf("请输入您的成绩等级 (A、B、C、D、F): ");
    scanf("%c", &grade);

    switch (grade) {
    case 'A':
        printf("优秀\n");
        break;
    case 'B':
        printf("良好\n");
        break;
    case 'C':
        printf("中等\n");
        break;
    case 'D':
        printf("及格\n");
        break;
    case 'F':
        printf("不及格\n");
        break;
    default:
        printf("无效的成绩等级\n");
    }

    return 0;
}
  • 汇编后
6:        printf("请输入您的成绩等级 (A、B、C、D、F): ");
004109A8   push        offset string "\xc7\xeb\xca\xe4\xc8\xeb\xc4\xfa\xb5\xc4\xb3\xc9\xbc\xa8\xb5\xc8\xbc\xb6
004109AD   call        printf (00410910)
004109B2   add         esp,4
7:        scanf("%c", &grade);
004109B5   lea         eax,[ebp-4]
004109B8   push        eax
004109B9   push        offset string "%c" (0042601c)
004109BE   call        scanf (00412c00)
004109C3   add         esp,8
8:
9:        switch (grade) {
004109C6   movsx       ecx,byte ptr [ebp-4]
004109CA   mov         dword ptr [ebp-8],ecx
004109CD   mov         edx,dword ptr [ebp-8]
004109D0   sub         edx,41h
004109D3   mov         dword ptr [ebp-8],edx
004109D6   cmp         dword ptr [ebp-8],5
004109DA   ja          $L592+0Fh (00410a31)
004109DC   mov         eax,dword ptr [ebp-8]
004109DF   jmp         dword ptr [eax*4+410A51h]
10:       case 'A':
11:           printf("优秀\n");
004109E6   push        offset string "\xd3\xc5\xd0\xe3\n" (00427034)
004109EB   call        printf (00410910)
004109F0   add         esp,4
12:           break;
004109F3   jmp         $L592+1Ch (00410a3e)
13:       case 'B':
14:           printf("良好\n");
004109F5   push        offset string "\xc1\xbc\xba\xc3\n" (0042702c)
004109FA   call        printf (00410910)
004109FF   add         esp,4
15:           break;
00410A02   jmp         $L592+1Ch (00410a3e)
16:       case 'C':
17:           printf("中等\n");
00410A04   push        offset string "\xd6\xd0\xb5\xc8\n" (00427024)
00410A09   call        printf (00410910)
00410A0E   add         esp,4
18:           break;
00410A11   jmp         $L592+1Ch (00410a3e)
19:       case 'D':
20:           printf("及格\n");
00410A13   push        offset string "\xbc\xb0\xb8\xf1\n" (0042701c)
00410A18   call        printf (00410910)
00410A1D   add         esp,4
21:           break;
00410A20   jmp         $L592+1Ch (00410a3e)
22:       case 'F':
23:           printf("不及格\n");
00410A22   push        offset string "\xb2\xbb\xbc\xb0\xb8\xf1\n" (00427014)
00410A27   call        printf (00410910)
00410A2C   add         esp,4
24:           break;
00410A2F   jmp         $L592+1Ch (00410a3e)
25:       default:
26:           printf("无效的成绩等级\n");
00410A31   push        offset string "\xce\xde\xd0\xa7\xb5\xc4\xb3\xc9\xbc\xa8\xb5\xc8\xbc\xb6\n" (00426ee8)
00410A36   call        printf (00410910)
00410A3B   add         esp,4
27:       }
28:
29:       return 0;
00410A3E   xor         eax,eax
30:   }