汇编语言编程编程练习_第1页
汇编语言编程编程练习_第2页
汇编语言编程编程练习_第3页
汇编语言编程编程练习_第4页
汇编语言编程编程练习_第5页
已阅读5页,还剩23页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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

2、FF指针 BX,NO循环 控YES结束:将寄存器程序如下所示:STACK SEGMENT STACKDW 128 DUP(?)STACK ENDSDATA SEGMENTBUFF DB 256 DUP(?)MEM1 DB ?MEM2 DB ?MEM3 DB ?DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATAMOV DS,AXMOV CX,256LEA BX, BUFFXOR DL,DLXOR DH,DHXOR SI,SI ; 统计计数器清 0NEXT:MOV AL,BX;取数据到 ALADD AL,0;做运算,影响标志位

3、SFJNSAA1INC DL;是正数,跳到 AA1;是负数,统计加1AA1: INC DH;是正数,加1INC BX;移动指针LOOP NEXT;循环控制MOV MEM1,DLMOV MEM2,DHMOV MEM3,SI;保存统计结果MOV AX,4C00HINT 21HCODE ENDSEND START代码转换编程将组合的 BCD 码 9649转换成二进制数,考 虑采 用( A*10 ) +B)*10)+C)*10+D 的算法。实验分析:由学习已知,写成十六进制的 BCD 码和十进制码是完全一样的,比如, 75D=01110101)BCD,而(01110101)B=75H。BCD码的运算也

4、遵循十进制运算规则,这一点可以方便计算机本身擅长的二进制运算结合 BCD 码的调整指令来完成。本题中,由于 9469H 计算机会默认为二进制数。因而,我们首先要做的是将9469h BCD 码先转换成十进制数,计算机将会以二进制形式存储。 最后再辅程序令其输出在屏幕上。助实验大抵流程如下:开初始化:设定执行: BCD码转二进制码结实验代码如下:DATAS SEGMENTbuffer1 DW 9649hbuffer2 DW ? ;分配两个字节的空间 DATAS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATASSTART: MOV AX,DATASMOV DS,AX

5、mov ax,buffer1and ax,0f000hmov cl,12shr ax,clmov dx,ax ;至此,已将 9649h(BCD)中的9(十进制)取出,并放入 dx 中call change ;调用 chang,将 9 乘以 10mov ax,dxmov bx,buffer1and bx,0f00hmov cl,8shr bx,cladd ax,bxmov dx,axcall changemov ax,dxmov bx,buffer1and bx,00f0hmov cl,4shr bx,cladd ax,bxmov dx,axcall changemov ax,dxmov bx,

6、buffer1and bx,000fhadd ax,bx ;至此, ax 中的值已是 9649(十进制),但电脑是将其以二进制的形式存储 的 , 故 应 是 25B1h , 二 进 制 就 是mov buffer2,ax ;因为后面会用到 ah,为避免在 其 过 程 中 丢 失 ax 中 的 数 据 , 故 将 ax 中的数据放入 buffer2 中mov cx,16again:shl buffer2,1 ;将已经转换成二进制的数逐个显示出来mov dl,0adc dl,30hmov ah,2int 21hloop againmov ah,4CHINT 21Hchange proc ;子程序

7、change的功能是实现 dx 乘以 10add dx,dxmov cx,dxadd dx,dxadd dx,dxadd dx,cxretchange ENDPCODES ENDSEND START排序将 80H 个无符号的八位二进制数按递增方式排列。同时考虑它们有符号数、方式。递减 等实验分析:实验要求将数排序,则用CMP 比较两个数大小,用标志位 JNG (有符号位不大于),JGE(有符号位不小于),JAE(无符号位不低于)来判定排序种类。准备将该题用 “冒泡排序法”,将其两两比较。前 一个数较大 (递减),则不会改变原来位置;否则,两数交换,依次将全部数据排序依次(小循环)。示例如下:1

8、3-399684-7558139684-3958-7596841358-39-7596845813-39-75不过,由于数据的原始情况不知,按以上方法排序一次不一定符合要求。本题采取多次小循环方法,用数据个数控制循环次数。这种方法效率低, 不过在循环次 数较少的情况下还是很简单的,毕竟原理很简单。该程序流程图如下:开初始化:初始化数据CX 数执行:采用变址寻址, 将NO前前 后 数地址加将结果写YESNOYES进 入 下结进入小循环直到数按照从大到小的顺序排列好为止。附程序如下:1)、无符号位从小到大:STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA

9、SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF;等值命令DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV CX,COUNT-1LOOP1:MOV DX,CX;保存循环次数MOV SI,0;采用变址寻址LOOP2:MOV AL,BUFFSICMP AL,BUFFSI+1; 前数与后数比JNA COT;前个数小于(或等于),转(无符号)XCHG AL,BUFFSI+1; 否则交换内存位置COT:MOV BUFFSI,ALINC SILOOP LOOP2;所有数据排列一

10、次MOV CX,DXLOOP LOOP1MOV AX,4C00HINT 21HCODE ENDSEND START;开始下一次排序2)、无符号位从大到小STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF;等值命令DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART:MOV AX,DATAMOV DS,AXMOV CX,COUNT-1LOOP1:MOV DX,CXMOV SI,0LOOP2:MOV AL,BUFFSICMP AL,

11、BUFFSI+1JNG COT;前个数小于(或等于),转(有符号)COT:XCHG AL,BUFFSI+1MOV BUFFSI,ALINC SILOOP LOOP2MOV CX,DXLOOP LOOP1MOV AX,4C00HINT 21HCODE ENDSEND START3)、有符号位递减STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTBUFF DB 128 DUP(?)COUNT EQU $-BUFF;等值命令DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA START:MOV AX,DATA

12、MOV DS,AXMOV CX,COUNT-1LOOP1:MOV DX,CXMOV SI,0LOOP2:MOV AL,BUFFSICMP AL,BUFFSI+1JGE COT;前个数大于(或等于),转(有符号)XCHG AL,BUFFSI+1MOV BUFFSI,ALCOT:INC SILOOP LOOP2MOV CX,DXLOOP LOOP1MOV AX,4C00HINT 21HCODE ENDSEND START2、数值运算编程(a)实验目的通过编程及程序调式,熟悉 8086/8088 运算指令及 DEBUG 动态调试程序的方法(b)实验内容无符号二进制数运算已知有 20 个 8 位的无符

13、号二进制数,编一个程序完成对这些数的求和。实验分析:求 20 个无符号的八位二进制数,直接进行二进制运算要将数值转换成二进制形式比较繁琐。由此想到写成十六进制的BCD码和十进制码是完全一样的,比如, 75D= (01110101)BCD,而( 01110101)B=75H。BCD 码的运算也遵循十进制运算规则,这一点可以方便计算机本身擅长的二进制运算结合BCD码的调整指令来完成。将输入的 20 个无符号八位二进制数看成 BCD 码的十六进制表示,直接进行 BCD 加法运算。最终将结果转换成以 ASCII 码形式输出,即为所得数的十六进制 BCD 码形式。流程图略。实验代码如下(参考):STAC

14、KSEGMENTSTACKSTACK;STACK SEGMENTDW 128 DUP(?) ; 128 WORDSSTACK ENDS ; SEGMENT ENDDATA SEGMENT PARA DATA ; DATA SEGMENTTABLE DB 01,02,03,04,05,06,07,08,09,10,11,12,13,14,15,16,1 7,18,19,20TOTAL DW ? ;BCD加法运算结果PRINT DB ? ; 显示的 ASCII字符DATA ENDS ; SEGMENT ENDCODE SEGMENT PARA CODEASSUMECS:CODE,DS:DATA,S

15、S:STACKMAIN PROC FARPUSH DSSUB AX,AXPUSH AX;DS:0000 为返回地址MOV AX,DATAMOV DS,AX;DS 初始化MOV AX,0LEABX,TABLE;DS:BX指 向TABLE 的首地址MOV CX,20;循环 20 次SUM: ADD AL,BXJNC OVERINC AHCLCOVER: INC BXLOOP SUMMOV TOTAL,AXMOV CX,0010LEA SI,PRINT+3L20: CMP AX,CX ; 值10?JB L30 ;是,退出XOR DX,DX ; 清除高位商DIV CX ; 除以 10OR DL,30H

16、MOV SI,DL ; 存 ASCII字符DEC SIJMP L20L30: OR AL,30H ; 存最后的商MOV SI,AL ; 作为 ASCII 字符 MOV AH,02H ; 打印算术结果MOV CX,4LEA DI,PRINTL10: MOV DL,DIINT 21HINC DILOOP L10MOV AX,4C00HINT 21HMAIN ENDPCODE ENDSEND MAINBCD 算术运算已知两个 6 位的 BCD 码,完成减法运算,设被减数为 123456,减数为 789123实验分析:本题中先做减法,再采用未组合的 BCD 码减法调整,从低位开始逐位做减法运算。将计算

17、结果低位存入 AL ,高位存于 AH 。总体来说,该题原理较为简单。实验代码如下(参考):STACK SEGMENT STACKDW 128 DUP(?)STACK ENDSDATA SEGMENT PARADATA NUMBER1 DB 789123 NUMBER2 DB 123456 SF DB - ; 需打印的符号 RESULT DB ? ; 存算术结果 DATA ENDSCODE SEGMENT PARACODE ASSUME CS:CODE,DS:DATA,SS:STACKMAIN PROC FARPUSH DSSUB AX,AXPUSH AXMOV AX,DATAMOV DS,AX

18、LEA SI,NUMBER1+5LEA DI,NUMBER2+5LEA BX,RESULT+5MOV CX,6CLCMOV AL,SI ; 将低位放在AL 中L10: MOV AH,SI-1 ; 将高位放在AH 中SBB AL,DIAAS ;做 ASCII减法调整OR AX,3030HMOV BX,AL ; 存单位运算结果MOV AL,AH ; 将下一位放入ALDEC SIDEC DIDEC BXLOOP L10MOV AH,02H ; 打印算术结果MOV CX,7LEA DI,SFL20: MOV DL,DIINT 21HINC DILOOP L20MOV AX,4C00HINT 21HMAIN ENDPCODE ENDSEND

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论