汇编排序小程序
kvew www.smatrix.org
刚开始看汇编,按着自己的思路写了这个程序,感觉很长的样子,后来看过几个排序的例程比这个短多了。还是寄存器的使用欠火候,呵呵,过河拆桥的本领还没到家啊!
先说说我的思路吧,用两个寄存器记录下数据的首地址和第二个地址,然后比较,第一个比第二个大,则交换,然后地址双双后移,再比较,否则两个直接后移一位,这样第一轮下来就把最大的放到了最后,然后依此类推,把第二大的放到倒数第二-------------循环结束时就把最小的放到第一的位置了。
下面程序编译运行应该得到123456789的字串。由于刚刚接触,程序还有待改进,如果您慷慨赐教,不胜感激!
源程序如下:
DATA SEGMENT
X DB 5,1,3,4,7,2,9,8,6
DATA ENDS
STACK SEGMENT STACK
DB 200 DUP(?)
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV CX,8 ;X中只有9个数,外部循环8次
LEA DI,X
MOV SI,DI ;DI为X第一个元素地址
ADD SI,1 ;SI+1 为第二个元素地址
PUSH SI ;保存这两个地址,外部第二轮循环同样是从开始比较
PUSH DI
LP: MOV BX,CX ;BX控制内部循环次数 1
LP1:
MOV AL,[DI]
CMP AL,[SI] ;比较DI和SI指向的元素的大小
JL LP2 ;DI指的数比SI小,跳到L4
XCHG AL,[SI] ;比SI大,交换它们中的内容
XCHG AL,[DI]
DEC BX ;比过一次后,BX减1
CMP BX,0
JZ LP3 ;如果BX为0了,说明内部的循环结束
MOV DI,SI ;如果BX不为0,SI和DI都移向下一个元素
ADD SI,1
JMP LP1 ;跳到前面继续比较
LP2: DEC BX
CMP BX,0
JZ LP3
ADD SI,1
ADD DI,1
JMP LP1
LP3: POP DI ;取出先前保存的首地址,进行下一次外部循环
POP SI
LOOP LP
MOV AH,2 ;准备打印结果
MOV CX,9
LEA BX,X
LP4: MOV DL,[BX] ;这个循环用来打印出结果
ADD DL,30H
INT 21H
INC BX
LOOP LP4
MOV AH,4CH
INT 21H
CODE ENDS
END START