汇编语言编程编程练习

上传人:hs****ma 文档编号:473470302 上传时间:2022-10-12 格式:DOC 页数:12 大小:50KB
返回 下载 相关 举报
汇编语言编程编程练习_第1页
第1页 / 共12页
汇编语言编程编程练习_第2页
第2页 / 共12页
汇编语言编程编程练习_第3页
第3页 / 共12页
汇编语言编程编程练习_第4页
第4页 / 共12页
汇编语言编程编程练习_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《汇编语言编程编程练习》由会员分享,可在线阅读,更多相关《汇编语言编程编程练习(12页珍藏版)》请在金锄头文库上搜索。

1、汇编语言编程编程练习一、实验题1. 非数值运算编程 (a)实验目的 通过非数值运算(如统计,分类,排序,代码转换等)编程,进一步掌握 8086/8088 汇 编语言程序设计方法和技巧 (b)实验内容 统计 设有100H个数,编程统计正数、负数和零的个数。 实验分析: 程序中数的总数很多,某些部分需要重复执行,因此要用到循环结构。循环结构 每次测试循环条件,当满足条件时,重复执行这一段程序;否则循环结束,顺序往下 执行。 其次,要统计正数、负数、零的个数,可以依靠标志位SF进行判断,SF=0,正 数;SF=1,负数;零则为总数减去正负数的个数。 该程序流程图如下:修改:移动缓冲区指针,循环次数减

2、一执行:从BUFF取数,进行算术运算,判断符号标志位SF初始化:设置缓冲区BUFF指针BX,设定循环次数256,统计计数器DL清零 开始循环控制: CX=0NOYES 结束:将寄存器的统计结果存入MEM单元,将控制交操作系统程序如下所示: STACK SEGMENT STACKDW 128 DUP(?)STACK ENDS DATA SEGMENTBUFF DB 256 DUP(?)MEM1 DB ?MEM2 DB ?MEM3 DB ?DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,2

3、56 LEA BX, BUFF XOR DL,DL XOR DH,DH XOR SI,SI ;统计计数器清0 NEXT:MOV AL,BX;取数据到AL ADD AL,0 ;做运算,影响标志位SF JNS AA1 ;是正数,跳到AA1 INC DL ;是负数,统计加1 AA1: INC DH ;是正数,加1 INC BX ;移动指针 LOOP NEXT ;循环控制 MOV MEM1,DL MOV MEM2,DH MOV MEM3,SI ;保存统计结果 MOV AX,4C00H INT 21HCODE ENDS END START 代码转换 编程将组合的BCD码9649转换成二进制数,考虑采用(

4、A*10)+B)*10)+C)*10+D 的算法。 实验分析: 由学习已知,写成十六进制的BCD码和十进制码是完全一样的,比如,75D= (01110101)BCD,而(01110101)B=75H。BCD码的运算也遵循十进制运算 规则,这一点可以方便计算机本身擅长的二进制运算结合BCD码的调整指 令来完成。 本题中,由于9469H计算机会默认为二进制数。因而,我们首先要做的是将 9469h BCD 码先转换成十进制数,计算机将会以二进制形式存储。最后再辅 助程序令其输出在屏幕上。 实验大抵流程如下: 开始 初始化:设定字节空间执行:BCD码转化成十进制 二进制码输出 结束实验代码如下:DAT

5、AS SEGMENT buffer1 DW 9649h buffer2 DW ? ;分配两个字节的空间 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX mov ax,buffer1 and ax,0f000h mov cl,12 shr ax,cl mov dx,ax ;至此,已将9649h(BCD)中的9(十进制)取出,并放入dx中 call change ;调用chang,将9乘以10 mov ax,dx mov bx,buffer1 and bx,0f00h mov cl,8

6、shr bx,cl add ax,bx mov dx,ax call change mov ax,dx mov bx,buffer1 and bx,00f0h mov cl,4 shr bx,cl add ax,bx mov dx,ax call change mov ax,dx mov bx,buffer1 and bx,000fhadd ax,bx ;至此,ax中的值已是9649(十进制),但电脑是将其以二进制的形式存 储的,故应是25B1h,二进制就是0010010110110001 mov buffer2,ax ;因为后面会用到ah,为避免在其过程中丢失ax中的数据,故将ax 中的数据

7、放入buffer2中 mov cx,16 again:shl buffer2,1 ;将已经转换成二进制的数逐个显示出来 mov dl,0 adc dl,30h mov ah,2 int 21h loop again mov ah,4CH INT 21H change proc ;子程序change的功能是实现dx乘以10 add dx,dx mov cx,dx add dx,dx add dx,dx add dx,cx ret change ENDPCODES ENDS END START 排序 将80H个无符号的八位二进制数按递增方式排列。同时考虑它们有符号数、递减等 方式。 实验分析: 实

8、验要求将数排序,则用CMP比较两个数大小,用标志位JNG(有符号位不 大于),JGE(有符号位不小于),JAE(无符号位不低于)来判定排序种类。 准备将该题用“冒泡排序法”,将其两两比较。前一个数较大(递减),则不会 改变原来位置;否则,两数交换,依次将全部数据排序依次(小循环)。示例 如下: 13 -39 96 84 -75 58 13 96 84 -39 58 -75 96 84 13 58 -39 -75 96 84 58 13 -39 -75 不过,由于数据的原始情况不知,按以上方法排序一次不一定符合要求。本题 采取多次小循环方法,用数据个数控制循环次数。这种方法效率低,不过在循环次

9、数较少的情况下还是很简单的,毕竟原理很简单。 该程序流程图如下: 执行:采用变址寻址,将前数与后数比较前数后数 前后数交换位置 将结果写入缓冲区CX数据总数 初始化:初始化数据段,设定循环次数 开始NO 地址加一YESNOYES 进入下一循环 结束 进入小循环直到数按照从大到小的顺序排列好为止。 附程序如下:1)、无符号位从小到大: STACK SEGMENT STACKDW 64 DUP(?)STACK ENDS DATA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF ;等值命令DATA ENDSCODE SEGMENT ASSUME CS:CODE,D

10、S:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,COUNT-1LOOP1:MOV DX,CX ;保存循环次数 MOV SI,0 ;采用变址寻址LOOP2:MOV AL,BUFFSI CMP AL,BUFFSI+1;前数与后数比 JNA COT ;前个数小于(或等于),转(无符号) XCHG AL,BUFFSI+1;否则交换内存位置 MOV BUFFSI,AL COT: INC SI LOOP LOOP2 ;所有数据排列一次 MOV CX,DX ;开始下一次排序 LOOP LOOP1 MOV AX,4C00H INT 21HCODE ENDS END START

11、2)、无符号位从大到小STACK SEGMENT STACKDW 64 DUP(?)STACK ENDS DATA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF ;等值命令DATA ENDSCODE SEGMENT ASSUME CS:CODE,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,COUNT-1LOOP1:MOV DX,CX MOV SI,0LOOP2:MOV AL,BUFFSI CMP AL,BUFFSI+1 JNG COT ;前个数小于(或等于),转(有符号) XCHG AL,BUFFSI+1 MOV BUFFSI,ALCOT: INC SI LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4C00H INT 21HCODE ENDS END START3)、有符号位递减STACK SEGMENT STA

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号