版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 MO
3、V CX,256 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码转化成十进制 二进制码输出
5、结束实验代码如下:DATAS 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,0f0
6、0h mov cl,8 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,000fhmov buffer2,ax ;因为后面会用到ah,为避免在其过程中丢失ax中的数据,故将ax 中的数据放入buffer2中 mov cx,16 again:shl buffer2,1 ;将已经转换成二进制的数逐个显示出来 mov dl,0
7、 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个无符号的八位二进制数按递增方式排列。同时考虑它们有符号数、递减等 方式。 实验分析: 实验要求将数排序,则用CMP比较两个数大小,用标志位JNG(有符号位不 大于),JGE(有符号位不小于),JAE(无符号位不低
8、于)来判定排序种类。 准备将该题用“冒泡排序法”,将其两两比较。前一个数较大(递减),则不会 改变原来位置;否则,两数交换,依次将全部数据排序依次(小循环)。示例 如下: 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,DS:DATASTART:MOV AX,DATA MOV DS,AX MOV CX,COUNT-1LOOP1:
10、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 START2)、无符号位从大到小STACK SEGMENT STACKDW 64 DUP(?)STACK ENDS D
11、ATA 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 MO
12、V AX,4C00H INT 21HCODE ENDS END START3)、有符号位递减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 JGE COT ;前个数大于
13、(或等于),转(有符号) XCHG AL,BUFFSI+1 MOV BUFFSI,ALCOT: INC SI LOOP LOOP2 MOV CX,DX LOOP LOOP1 MOV AX,4C00H INT 21HCODE ENDS END START2、数值运算编程(a)实验目的 通过编程及程序调式,熟悉 8086/8088 运算指令及 DEBUG 动态调试程序的方法(b)实验内容 ·无符号二进制数运算 已知有 20 个 8 位的无符号二进制数,编一个程序完成对这些数的求和。 实验分析: 求20个无符号的八位二进制数,直接进行二进制运算要将数值转换成二进制 形式比较繁琐。由此想到写
14、成十六进制的BCD码和十进制码是完全一样的, 比如,75D= (01110101)BCD,而(01110101)B=75H。BCD码的运算也遵 循十进制运算规则,这一点可以方便计算机本身擅长的二进制运算结合BCD 码的调整指令来完成。 将输入的20个无符号八位二进制数看成BCD码的十六进制表示,直接进行 BCD加法运算。最终将结果转换成以ASCII码形式输出,即为所得数的十六 进制BCD码形式。 流程图略。 实验代码如下(参考):STACK SEGMENT STACK 'STACK' ; STACK SEGMENTDW 128 DUP(?) ; 128 WORDSSTACK E
15、NDS ; SEGMENT ENDDATA SEGMENT PARA 'DATA' ; DATA SEGMENTTABLE DB 01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,17,18,19,20TOTAL DW ? ;BCD 加法运算结果PRINT DB ? ;显示的 ASCII 字符DATA ENDS ; SEGMENT ENDCODE SEGMENT PARA 'CODE'ASSUME CS:CODE, DS:DATA, SS:STACKMAIN PROC FAR PUSH DS SUB AX,AX PU
16、SH 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 CLCOVER: INC BX LOOP SUM MOV TOTAL,AX MOV CX,0010 LEA SI,PRINT+3L20: CMP AX,CX ;值<10? JB L30 ;是,退出 XOR DX,DX ;清除高位商 DIV CX ;除以 10 OR DL,30H MOV SI,DL ;存 ASCII 字符
17、 DEC SI JMP L20L30: OR AL,30H ;存最后的商 MOV SI,AL ;作为 ASCII 字符 MOV AH,02H ;打印算术结果 ; MOV CX,4 LEA DI,PRINTL10: MOV DL,DI INT 21H INC DI LOOP L10 MOV AX,4C00H INT 21HMAIN ENDPCODE ENDSEND MAIN ·BCD算术运算 已知两个 6 位的 BCD 码,完成减法运算,设被减数为 123456,减数为 789123 实验分析: 本题中先做减法,再采用未组合的BCD码减法调整,从低位开始逐位做减法运算。 将计算结果低位
18、存入AL,高位存于AH。总体来说,该题原理较为简单。实验代码如下(参考): STACK SEGMENT STACKDW 128 DUP(?)STACK ENDSDATA SEGMENT PARA'DATA'NUMBER1 DB '789123'NUMBER2 DB '123456'SF DB '-' ;需打印的符号RESULT DB ? ;存算术结果DATA ENDSCODE SEGMENT PARA'CODE'ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FAR PUSH DS SUB AX,AX PUSH AX MOV AX,DATA MOV DS,AX LEA SI,NUMB
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论