被坑了哇,看到爱达人官网那里有一个3块钱的练习代码下载,还以为是刚开始提到的那个有基础的人觉得无聊的话就去逆的那个程序,买了下载了一看只是一个很普通的交换排序,不知道是干啥用的,是说的那个无聊就去逆的吗?不管了反正课也直接拉进度条听完了

do…while语句

语句及对应反汇编示例:

总结:

  • 根据条件跳转指令所跳转到的地址,可以得到循环语句块的起始地址
  • 根据条件跳转指令所在的地址,可以得到循环语句块的结束地址
  • 条件跳转的逻辑与源码相同

while语句

语句及对应反汇编示例:

总结:

  • 根据条件跳转指令所跳转到的地址,可以得到循环语句块的结束地址
  • 根据 jmp 指令所跳转到的地址,可以得到循环语句块的起始地址
  • 在还原 while 比较时,条件跳转的逻辑与源码相反

for语句

语句及对应反汇编示例:

总结:

  • 第一个 jmp 指令之前为赋初值部分
  • 第一个 jmp 指令所跳转的地址为循环条件判定部分起始
  • 判断条件后面的跳转指令条件成立时跳转的循环体外面

执行效率:do…while > while > for

课后作业

  1. 判断数组是否是对称的,如果是返回1,不是返回0

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    #include <stdio.h>

    int arr[1000];

    int Function(int len) {
    for (int i = 0; i < len / 2; i++) {
    if (arr[i] != arr[len - i - 1]) {
    return 0;
    }
    }
    return 1;
    }

    int main(int argc, char* argv[]) {
    int num;
    scanf("%d", &num);
    for (int i = 0; i < num; i++) {
    scanf("%d", &arr[i]);
    }
    printf("%d\n", Function(num));
    return 0;
    }
  2. 编写程序实现一个冒泡排序的算法

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    #include <stdio.h>

    void BubbleSort(int *arr, int num) {
    for(int i = 0; i < num - 1; i++) {
    for(int j = 0; j < num - 1 - i; j++) {
    if(arr[j] > arr[j+1]) {
    int temp = arr[j];
    arr[j] = arr[j+1];
    arr[j+1] = temp;
    }
    }
    }
    }

    int main(int argc, char* argv[]){
    int arr[10] = {1, 2, 5, 2, 7, 8, 4, 1, 0, 9};
    BubbleSort(arr, 10);
    for(int i = 0; i < 10; i++) {
    printf("%d ", arr[i]);
    }
    getchar();
    return 0;
    }