汇编学习笔记->数组的冒泡排序

编译环境:emu8086
附:汇编常用跳转指令及其检测位
https://blog.csdn.net/c529283955/article/details/103015482

使用冒泡排序算法对数组进行升序排序

由于数组中有负数,因此比较两数大小时,应当使用带符号的跳转指令。数组用dw定义时,要取下一个数的位置时,应使用bx+2,因为1个字(word)=2个字节(byte)

(一)数组用db定义

datas segment
    n   db 6
    num db -20,6 ,4 ,100 ,20 ,1
datas ends

stack segment
    dw 128 dup(0)    
stack ends

codes segment 
    assume cs:codes,ds:datas,es:datas
start:
    mov ax,datas
    mov ds,ax
    mov es,ax
    
    mov cl,n        ;外循环次数
    xor ch,ch       ;异或对ch清零
    dec cx          ;实际循环次数为n-1
again_out:
    lea bx,num
    mov dx,cx       ;设置内循环的次数
again_in:
    mov al,[bx]
    mov ah,[bx+1]
    cmp al,ah       ;比较两数的大小
    jle ok          ;前一个数<=后一个数,因此不交换
    mov [bx+1],al   ;交换两数
    mov [bx],ah
ok:
    inc bx          ;数组下标向后移动一位(相当于j++)
    dec dx          ;内循环次数-1,若减一的结果为0,则ZF=1
    jne again_in    ;ZF=0时跳转到again_in,ZF=1时会顺序执行下边的指令
    loop again_out  ;回到外循环
    
    mov ah,4ch
    int 21h    
codes ends
end start

(二)数组用dw定义

注释大致与上相同,si为16位寄存器,但不可拆分为2个8位寄存器来使用

datas segment
    n   db 6
    num dw -20,6 ,4 ,100 ,20 ,1
datas ends

stack segment
    dw 128 dup(0)    
stack ends

codes segment 
    assume cs:codes,ds:datas,es:datas
start:
    mov ax,datas
    mov ds,ax
    mov es,ax
    
    mov cl,n        ;外循环次数
    xor ch,ch       ;异或对ch清零
    dec cx          ;实际循环次数为n-1
again_out:
    lea bx,num
    mov dx,cx       ;
again_in:
    mov ax,[bx]
    mov si,[bx+2]
    cmp ax,si
    jle ok
    mov [bx+2],ax
    mov [bx],si
ok:
    add bx,2
    dec dx
    jne again_in    
    loop again_out
    
    mov ah,4ch
    int 21h    
codes ends
end start        

一些指令的说明

jle

jump when less or equal [小于等于时跳转]
SF ≠ OF or ZF=1时跳转
SF为正负符号位(Sign Flag),0为正数,1为负数
OF为溢出符号位(Overflow Flag),运算结果溢出时,OF=1,否则为0

jne

jump when not equal [不等于时跳转]
ZF=0时跳转至标号处执行,ZF=1时会顺序执行下边的指令(ZF=1时不跳转)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值