汇编语言(奇偶排序)

查看 32|回复 1
作者:hao6118   
汇编语言(赏金只剩100,可加其他赏金。)
dosbox+masm
编程:
手动输入一些整数,整数输入完毕后,再手动输入1或者0。若输入1则表示要选择表中的奇数,排序后输出,并输出奇数的个数。若输入0则表示要选择表中的偶数,排序后输出,并输出偶数的个数。

汇编语言, 奇偶

helen666   

[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
您需要登录后才可以回帖 登录 | 立即注册

返回顶部