采取多次小循环方法,用数据个数控制循环次数。这种方法效率低,不过在循环次 数较少的情况下还是很简单的,毕竟原理很简单。
该程序流程图如下: 开始 初始化:初始化数据段,设定循环次数 NO CX>数据总数
执行:采用变址寻址,将前数与后数比较 地址加一 YES 前数>后数
NO 前后数交换位置
将结果写入缓冲区 YES 进入下一循环 结束
进入小循环直到数按照从大到小的顺序排列好为止。 附程序如下: 1)、无符号位从小到大:
STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS
DATA SEGMENT BUFF DB 128 DUP(?)
COUNT EQU $-BUFF ;等值命令 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX
MOV CX,COUNT-1
LOOP1:MOV DX,CX ;保存循环次数 MOV SI,0 ;采用变址寻址 LOOP2:MOV AL,BUFF[SI]
CMP AL,BUFF[SI+1];前数与后数比
JNA COT ;前个数小于(或等于),转(无符号) XCHG AL,BUFF[SI+1];否则交换内存位置 MOV BUFF[SI],AL COT: INC SI
LOOP LOOP2 ;所有数据排列一次 MOV CX,DX ;开始下一次排序 LOOP LOOP1 MOV AX,4C00H INT 21H CODE ENDS END START 2)、无符号位从大到小 STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS
DATA SEGMENT BUFF DB 128 DUP(?)
COUNT EQU $-BUFF ;等值命令 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX
MOV CX,COUNT-1 LOOP1:MOV DX,CX MOV SI,0
LOOP2:MOV AL,BUFF[SI] CMP AL,BUFF[SI+1]
JNG COT ;前个数小于(或等于),转(有符号) XCHG AL,BUFF[SI+1] MOV BUFF[SI],AL COT: INC SI
LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4C00H INT 21H CODE ENDS END START 3)、有符号位递减
STACK SEGMENT STACK DW 64 DUP(?) STACK ENDS
DATA SEGMENT BUFF DB 128 DUP(?)
COUNT EQU $-BUFF ;等值命令 DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA START:MOV AX,DATA MOV DS,AX
MOV CX,COUNT-1 LOOP1:MOV DX,CX MOV SI,0
LOOP2:MOV AL,BUFF[SI] CMP AL,BUFF[SI+1]
JGE COT ;前个数大于(或等于),转(有符号) XCHG AL,BUFF[SI+1] MOV BUFF[SI],AL COT: INC SI
LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4C00H
INT 21H CODE ENDS END START
2、数值运算编程 (a)实验目的
通过编程及程序调式,熟悉 8086/8088 运算指令及 DEBUG 动态调试程序的方法 (b)实验内容
·无符号二进制数运算
已知有 20 个 8 位的无符号二进制数,编一个程序完成对这些数的求和。 实验分析:
求20个无符号的八位二进制数,直接进行二进制运算要将数值转换成二进制 形式比较繁琐。由此想到写成十六进制的BCD码和十进制码是完全一样的, 比如,75D= (01110101)BCD,而(01110101)B=75H。BCD码的运算也遵 循十进制运算规则,这一点可以方便计算机本身擅长的二进制运算结合BCD 码的调整指令来完成。
将输入的20个无符号八位二进制数看成BCD码的十六进制表示,直接进行 BCD加法运算。最终将结果转换成以ASCII码形式输出,即为所得数的十六 进制BCD码形式。
流程图略。
实验代码如下(参考):
STACK SEGMENT STACK 'STACK' ; STACK SEGMENT DW 128 DUP(?) ; 128 WORDS STACK ENDS ; SEGMENT END
DATA SEGMENT PARA 'DATA' ; DATA SEGMENT
TABLE DB 01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20 TOTAL DW ? ;BCD 加法运算结果 PRINT DB ? ;显示的 ASCII 字符 DATA ENDS ; SEGMENT END
CODE SEGMENT PARA 'CODE'
ASSUME CS:CODE, DS:DATA, SS:STACK MAIN PROC FAR PUSH DS SUB AX,AX
PUSH AX ;DS:0000为返回地址
MOV AX,DATA
MOV DS,AX ;DS初始化 MOV AX,0
LEA BX,TABLE ;DS:BX指向TABLE的首地址 MOV CX,20 ;循环20次
SUM: ADD AL,[BX] JNC OVER INC AH CLC
OVER: INC BX LOOP SUM
MOV TOTAL,AX MOV CX,0010 LEA SI,PRINT+3 L20: CMP AX,CX ;值<10? JB L30 ;是,退出
XOR DX,DX ;清除高位商 DIV CX ;除以 10 OR DL,30H
MOV [SI],DL ;存 ASCII 字符 DEC SI JMP L20
L30: OR AL,30H ;存最后的商
MOV [SI],AL ;作为 ASCII 字符 MOV AH,02H ;打印算术结果 ; MOV CX,4 LEA DI,PRINT L10: MOV DL,[DI] INT 21H INC DI LOOP L10
MOV AX,4C00H INT 21H MAIN ENDP CODE ENDS END MAIN
·BCD算术运算
已知两个 6 位的 BCD 码,完成减法运算,设被减数为 123456,减数为 789123 实验分析:
本题中先做减法,再采用未组合的BCD码减法调整,从低位开始逐位做减法运算。