冒泡排序等几个汇编程序
1. 冒泡排序
冒泡排序
DATA SEGMENT WORD PUBLIC 'DATA'
ORG 00H
ARRAY_SIZE DW 5 ;待排序的数的个数
NUMBER_ARRAY DW 100D, 64D, 79D, 22D, 113D ;待排序的数
PRIVIOUS DW 00H ;用来存放冒牌排序中比较时的数
LAST DW 00H ;用来存放冒牌排序中比较时的数
TEN DB 10 ;数字10, 用于分解一个数
DATA ENDS
EXTRA SEGMENT WORD PUBLIC 'EXTRA'
EXTRA ENDS
CODE SEGMENT WORD PUBLIC 'CODE'
INITIIALIZE PROC ;用来初始化段寄存器的过程
MOV AX, EXTRA
MOV ES, AX
MOV AX, DATA
MOV DS, AX
RET
INITIIALIZE ENDP
TERMINATE PROC ;用来退出程序的过程
MOV AH, 4CH
INT 21H ;因为程序直接退出, 可以不需要加RET
RET
TERMINATE ENDP
PRINTLN PROC ;换行的过程
PUSH AX
PUSH DX ;过程中要用到这两个寄存器, 先把原来的值存到栈里
MOV AH, 2 ;功能号2是字符显示
MOV DL, 0DH ;DL寄存器存放打印字符, 这里是0D是换行的意思
INT 21H ;中断操作, 进行打印字符
MOV DL, 0AH ;0A是光标指向第一个字符的意思
INT 21H ;中断操作
POP DX
POP AX ;将原来的值再放回对应的寄存器
RET ;过程结束, 返回
PRINTLN ENDP
PRINT_ARRAY PROC ;打印输出排序的数字
; 算法: 将一个数字逐一与10相除, 余数入栈, 商继续除以10, 直到商为0, 此时将栈中的元素逐一出栈, 则可以得到这个数字每一位的数, 再+48可以得到每一位的字符数字, 再输出即可看到这个数字被打印出来了
; 因为直接输出这个数, 会输出这个数的ASCII码, 不是我们想要的值, 所以要注意分解位数, 再+48输出
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV DI, OFFSET ARRAY_SIZE ;获取内存中这组数字的第一个数的偏移地址
MOV CX, [DI] ;将偏移地址放入CX寄存器
MOV SI, OFFSET NUMBER_ARRAY ;获取内存中存放这组数字长度的位置的偏移地址
MOV BX, 0
AGAIN:
MOV AX, [BX+SI] ;将第一个数字的值放入AX中, 采用基址间址寻址
PUSH CX ;下面要用到CX寄存器, 先将之前的内容入栈, 用完后再出栈即可恢复原来的功能
PUSH BX ;下面要用到BX寄存器
XOR CX, CX ;CX置零
DIVISION:
IDIV [TEN]
XOR BX, BX
MOV BL, AH
ADD BL, 48
PUSH BX
MOV AH, 0
INC CX
CMP AX, 0
JNE DIVISION
OUTPUT:
XOR AX, AX
POP AX
MOV DX, AX
MOV AH, 2
INT 21H
LOOP OUTPUT
MOV DL, ' '
INT 21H
POP BX
ADD BX, 2
POP CX
LOOP AGAIN
POP DX
POP CX
POP BX
POP AX
RET
PRINT_ARR

本文介绍了使用汇编语言编写的冒泡排序算法、键盘输入字符串的程序以及将两个数字转化为十进制并输出的示例。通过这些代码展示了基础的汇编编程技巧和数据处理过程。
最低0.47元/天 解锁文章
4262





