概述
编译环境: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时不跳转)
最后
以上就是害怕眼神为你收集整理的汇编学习笔记->数组的冒泡排序使用冒泡排序算法对数组进行升序排序一些指令的说明的全部内容,希望文章能够帮你解决汇编学习笔记->数组的冒泡排序使用冒泡排序算法对数组进行升序排序一些指令的说明所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复