汇编实验(五)补充之有符号数的冒泡排序
关于有符号数和无符号数
我们的hua老师要求我们将无符号数的冒泡排序改为有符号数的冒泡排序,开始的时候一脸懵逼,网上有各种什么移码之类的说法,一头雾水根本看不懂。
后来发现一篇博客说的其实汇编语言是有处理无符号数和有符号数的比较的,就是(jl/jg)判断条件时针对有符号数的,(ja/jb)判断条件时针对无符号数的,后又翻了一遍课本感觉自己像个白痴,恨自己不好好听课。
还有,输入的时候需要出入有符号数的补码,证书就是他的二进制表示,负数的话就是除符号位以外取反,在末位加一,比如“-1”原码(都是说的8位二进制数字)是1000 0001,补码就是1111 1110末位加一,即1111 1111就是0ffH。
代码
data segment
org 3000h
num db 30h,35h,36h,37h,40h,79h,66h,78h,67h,0FFh,80h
;0ffh,80h分别为-1和-128的补码
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax;装数据段
mov cx,0ah;11个数据外层循环为10次
mov bh,0;用来计数外层循环的次数,证明改进算法的效率
outloop:
push cx;外层循环的cx值
mov si,offset num;数据首地址
add bh,1;外循环计数
mov bl,0;用于标记一个内循环的过程中发生交换次数
;用于改进算法的标志位
inloop:;内循环
mov al,[si]
cmp al,[si+1]
jl noswap ;jl为有符号数的比较
;不要觉得有符号数比较有多么难,so easy
xchg al,[si+1]
mov [si],al
mov bl,1
noswap:
inc si
loop inloop
cmp bl,0;判断内循环是否发生交换,如果无交换
je exitip;说明数据的顺序已经符合要求,可以退出
pop cx
loop outloop
exitip:
mov ax,4c00h
int 21h
code ends
end start
运行截图
可以看出这11个数据时排序的好的,其中80为**-128的补码,ff为-1**的补码。
我们可以换个顺序测试这组数据,看看改进的冒泡排序有没有提升效率
我们只将最后五个数字的顺序打乱,可以试一试这时候改进算法的循环次数。
可以看出对于这种前一部分顺序比较好的数据来说,改进算法可以提升很大的效率。