汇编语言(赏金只剩100,可加其他赏金。) dosbox+masm 编程: 手动输入一些整数,整数输入完毕后,再手动输入1或者0。若输入1则表示要选择表中的奇数,排序后输出,并输出奇数的个数。若输入0则表示要选择表中的偶数,排序后输出,并输出偶数的个数。 汇编语言, 奇偶
[Asm] 纯文本查看 复制代码; 初始化数据段 data segment input db 100 dup(0) ; 输入的整数数组 count db 0 ; 输入的整数个数 choice db 0 ; 选择奇数或偶数 odd db 100 dup(0) ; 奇数数组 even db 100 dup(0) ; 偶数数组 odd_count db 0 ; 奇数个数 even_count db 0 ; 偶数个数 data ends ; 初始化代码段 code segment start: mov ax, data ; 设置数据段地址 mov ds, ax ; 输入整数 input_loop: mov ah, 1h ; 单字符输入功能号 int 21h ; 调用DOS中断 cmp al, 13 ; 判断是否回车结束输入 je input_end sub al, '0' ; 将字符转换为数字 mov input[count], al ; 存储输入的整数 inc count ; 输入的整数个数加1 jmp input_loop input_end: mov ah, 2h ; 单字符输出功能号 mov dl, 10 ; 输出换行符 int 21h ; 输入选择奇数或偶数 mov ah, 1h ; 单字符输入功能号 int 21h sub al, '0' ; 将字符转换为数字 mov choice, al ; 判断奇偶性并存储到对应数组中 judge_loop: mov cl, count ; 设置循环次数为输入的整数个数 judge: mov al, input[count - cl] ; 取出一个整数进行判断 and al, 1 ; 判断奇偶性 cmp al, choice ; 判断是否与选择相同 jne judge_next cmp choice, 1 ; 判断选择奇数还是偶数 je store_odd store_even: mov even[even_count], input[count - cl] ; 存储到偶数数组中 inc even_count ; 偶数个数加1 jmp judge_next store_odd: mov odd[odd_count], input[count - cl] ; 存储到奇数数组中 inc odd_count ; 奇数个数加1 judge_next: loop judge sort_odd: ; 对奇数数组进行排序(冒泡排序) mov cx, odd_count; 设置外层循环次数为奇数个数减1 outer_loop_odd: mov bx, cx; 设置内层循环次数为外层循环次数减1 inner_loop_odd: mov ax, odd[bx-1]; 取出两个相邻元素进行比较 cmp ax, odd[bx]; 比较两个相邻元素 jle next_odd; 如果前一个元素小于等于后一个元素,则不交换 xchg ax, odd[bx]; 否则交换两个相邻元素 mov odd[bx-1], ax; 将交换后的元素存回数组中 next_odd: dec bx; 内层循环次数减1 jnz inner_loop_odd; 如果内层循环次数不为0,则继续循环 loop outer_loop_odd; 外层循环次数减1,如果外层循环次数不为0,则继续循环 sort_even: ; 对偶数数组进行排序(冒泡排序) mov cx, even_count; 设置外层循环次数为偶数个数减1 outer_loop_even: mov bx, cx; 设置内层循环次数为外层循环次数减1 inner_loop_even: mov ax, even[bx-1]; 取出两个相邻元素进行比较 cmp ax, even[bx]; 比较两个相邻元素 jle next_even; 如果前一个元素小于等于后一个元素,则不交换 xchg ax, even[bx]; 否则交换两个相邻元素 mov even[bx-1], ax; 将交换后的元素存回数组中 next_even: dec bx; 内层循环次数减1 jnz inner_loop_even; 如果内层循环次数不为0,则继续循环 loop outer_loop_even; 外层循环次数减1,如果外层循环次数不为0,则继续循环 output_odd: ; 输出奇数数组和奇数个数(使用DOS中断) mov ah, 2h ; 单字符输出功能号 mov dl, 'O' ; 输出O int 21h mov dl, 'd' ; 输出d int 21h mov dl, 'd' ; 输出d int 21h mov dl, ':' ; 输出冒号 int 21h mov dl, ' ' ; 输出空格 int 21h mov cx, odd_count ; 设置循环次数为奇数个数 output_odd_loop: mov al, odd[odd_count - cl] ; 取出一个奇数进行输出 add al, '0' ; 将数字转换为字符 mov dl, al ; 设置要输出的字符 int 21h ; 调用DOS中断进行输出 mov dl, ' ' ; 输出空格 int 21h loop output_odd_loop mov dl, 10 ; 输出换行符 int 21h mov ah, 9h ; 字符串输出功能号 mov dx, offset odd_count_str ; 设置要输出的字符串地址 int 21h mov ah, 2h ; 单字符输出功能号 mov al, odd_count ; 取出奇数个数进行输出 add al, '0' ; 将数字转换为字符 mov dl, al ; 设置要输出的字符 int 21h output_even: ; 输出偶数数组和偶数个数(使用DOS中断) mov ah, 2h ; 单字符输出功能号 mov dl, 'E' ; 输出E int 21h mov dl, 'v' ; 输出v int 21h mov dl, 'e' ; 输出e int 21h mov dl, 'n' ; 输出n int 21h mov dl, ':' ; 输出冒号 int 21h mov dl, ' ' ; 输出空格 int 21h mov cx, even_count ; 设置循环次数为偶数个数 output_even_loop: mov al, even[even_count - cl] ; 取出一个偶数进行输出 add al, '0' ; 将数字转换为字符 mov dl, al ; 设置要输出的字符 int 21h ; 调用DOS中断进行输出 mov dl, ' ' ; 输出空格 int 21h loop output_even_loop mov dl, 10 ; 输出换行符 int 21h mov ah, 9h ; 字符串输出功能号 mov dx, offset even_count_str ; 设置要输出的字符串地址 int 21h mov ah, 2h ; 单字符输出功能号 mov al, even_count ; 取出偶数个数进行输出 add al, '0' ; 将数字转换为字符 mov dl, al ; 设置要输出的字符 int 21h end_program: ; 结束程序(使用DOS中断) cmp choice ,1; 判断选择奇数还是偶数 je output_odd; 如果选择奇数,则跳转到output_odd标签处执行 jmp output_even; 否则跳转到output_even标签处执行 code ends end start