汇编语言编程编程练习(2)

2019-04-01 21:28

采取多次小循环方法,用数据个数控制循环次数。这种方法效率低,不过在循环次 数较少的情况下还是很简单的,毕竟原理很简单。

该程序流程图如下: 开始 初始化:初始化数据段,设定循环次数 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码减法调整,从低位开始逐位做减法运算。


汇编语言编程编程练习(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:[课程思政]高 燕:课程思政建设的关键问题与解决路径

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: