编辑: 于世美 | 2019-07-03 |
了解汇编程序的循环控制. 熟悉汇编程序中指令的寻址方式. 实验内容和分析 对连续存放的一组数据按递增序进行冒泡排序. 对已放入数据段中的一组数据按递增序进行冒泡排序时,假设排在最前面的元素是最大的,然后用它与后面相邻的元素依次比较.如果发现后面的元素比它大,则假设这个发现的大元素为最大值继续往下比较,一旦发现后面相邻的元素比它小,则把这两个元素换个位置,然后继续往下比较,直到一趟排序完成,产生一个最大的元素. 对于N个元素,需要N-1趟排序,每趟排序比较次数与趟数I的关系是M=N-I.因而在循环处理中会出现两个循环:一个N-1趟排序循环,一个每趟比较的循环.而在汇编中,用于循环计数的寄存器只有CX一个,同时这两个循环的循环次数是有联系的,因而从外循环进到内循环时需要把CX存起来,从内循环出到外循环时,再把保存下来的值重新赋给CX.从而达到使用一个CX,实现两个循环的目的. 程序代码 ;
THIS PROGRAM IS TO SORT AN ARRAY USING THE METHOD OF BUBBLING ;
DESIGNER: ;
DATE:2005.11.5 DATAREA SEGMENT LIST DB 35H,07H,11H,08H,42H,18H,15H,20H ;
待排序数据 PRE_SORT DB '
PRE_SORT:35H,07H,11H,08H,42H,18H,15H,20H$'
DATAREA ENDS PROGNAME SEGMENT MAIN PROC FAR ASSUME DS:DATAREA,CS:PROGNAME START: MOV AX,DATAREA ;
将符号地址赋给累加器 MOV DS,AX ;
把符号地址赋给数据段寄存器 MOV AH,09H ;
将功能号9赋给AH MOV DX,OFFSET PRE_SORT ;
将符号变量的偏移量赋给DX INT 21H ;
进行字符串的中断输出 MOV AH,02H ;
将功能号2赋给AH MOV DL,0AH ;
将换行的ASCII码赋给DL INT 21H ;
字符输出中断 MOV AH,02H MOV DL,0DH ;
将回车的ASCII码赋给DL INT 21H MOV CX,8 DEC CX ;
CX自减1 BACK: MOV DI,CX ;
将CX保存到DI中XOR SI,SI ;
清空SI LOOP1: MOV AL,LIST[SI] ;
把数据段中的第一个元素赋给AL CMP AL,LIST[SI+1] ;
AL中的元素与后面相邻元素比较 JBE NEXT ;
若小于等于,则跳到next XCHG AL,LIST[SI+1] ;
若大,进行交换 MOV LIST[SI],AL NEXT: INC SI ;
SI自增 LOOP LOOP1 ;
内层循环 MOV CX,DI ;
把保存的值重新赋给CX LOOP BACK ;
外层循环 MOV CX,8 XOR SI,SI AGAIN: MOV AX,CX XOR DI,DI MOV DL,LIST[SI] MOV BL,DL MOV CL,4 ROL DL,CL ;
DL中的数据循环左移4位MOV CX,AX AND DL,0FH ;
屏蔽高四位 CMP DL,0AH ;
与10比较大小 JAE GRE_EQU ADD DL,30H ;
小于10,加上30H构成其对应字符ACSII码JMP PRINT LOW1: INC DI MOV DL,BL AND DL,0FH CMP DL,0AH JAE GRE_EQU ADD DL,30H JMP PRINT GRE_EQU: ADD DL,37H PRINT: MOV AH,02H INT 21H CMP DI,0 JE LOW1 INC SI MOV DL,48H ;
输入字符'
H'
的ASCII码MOV AH,02H INT 21H MOV DL,2CH ;
输入字符'
,'
的ASCII码MOV AH,02H INT 21H LOOP AGAIN MOV AH,07H INT 21H MOV AX,4C00H INT 21H MAIN ENDP PROGNAME ENDS END START 实验总结 通过这个实验,我基本了解了汇编程序的构建方法以及汇编程序的结构,知道写一个汇编程序应该写哪几个部分.对于汇编程序的变量定义也有了一定程度上的了解,知道定义后的数据在内存中是连续存放的,这使我对汇编的段定义有了深刻的认识.同时在程序中涉及到的输出,使我清楚了要输出一个字符应该怎样进行寄存器的赋值,同时也学会了怎样使用中断指令. 程序中涉及到了两重循环,使我掌握了如何去用有限的寄存器实现多重循环的控制,同时对循环控制指令loop有了深刻的了解,知道怎样在一个循环中如何使用该指令,如何设置循环控制条件. 在程序调试中,我通过对程序的检查,发现了程序中的一些错误,使我对一些指令的使用有了更深刻的理解.例如在程序中,需要将DL中的数据循环左移4位,我最初用的指令是ROL DL,4,使得程序出现错误,导致了不小的麻烦.因而在以后的程序编写过程中,应该对每个指令做认真的分析,防止指令使用上的错误. 实验二 实验目的 进一步熟悉汇编程序的结构. 熟悉汇编指令的使用. 正确使用汇编指令中的寻址方式. 掌握汇编程序中的输入和输出方法. 实验内容和分析 从计算机键盘上输入一个四位十六进制数,在显示器上显示其二进制形式. 在程序的数据段中为输入的十六进制数开辟空间,用来存储输入的十六进制数.从键盘输入的数在数据段中存储的是其在ASCII码中对应的编码,首先解决的问题是要把输入字符的ASCII码转换成输入数的二进制形式.然后再通过一位一位的左移命令将其对应的二进制数一位一位的从高位移出来,同时也要清楚移出的数是不能立即输出的,要转换成它对应的ASCII码值,才能进行输出. 程序代码 ;