写了半天发现资料不多,放上来造福一下人类,主要题库的题也好多题解太少
一
用汇编语言编写程序,要求实现以下功能:
程序执行后,屏幕显示提示信息:“Please Enter The Password:”,等待输入用户的5位密码(含字母和数字)。密码输入后,与程序内设定的密码相比较,如果比较结果正确,显示“Welcome To Scce!”,如果不正确,则显示你的学号和姓名拼音。
请在答题时,按照以下格式填写内容:
1、程序源代码(包含必要的注释信息)
2、程序运行截图
DATA SEGMENT
INPUT DB "Please Enter The Password:",'$'
PASS DB "12345",'$'
OUTPUT DB "Welcome To Scce!",'$'
ERR DB "PASSWORD ERROR!",'$'
BUFFER DB 20 ;预定义20字节的空间DB 0 ;待输入完成后,自动获取输入的字符个数DB 20 DUP(0)
CRLF DB 0AH,0DH,'$'
DATA ENDSSTACK SEGMENT STACKDW 20 DUP(0) ;在此输入堆栈段代码
STACK ENDSCODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:MOV AX,DATAMOV DS,AX LEA DX,INPUT ;打印提示输入信息INPUTMOV AH,09HINT 21H LEA DX,BUFFER ;接收字符串BUFFERMOV AH,0AHINT 21H MOV AL,BUFFER+1 ;对字符串进行处理ADD AL,2MOV AH,0MOV SI,AXMOV BUFFER[SI],'$'LEA SI,BUFFER+2PUSH DSPOP ESLEA DI,PASSMOV CX,0MOV CL,BUFFER+1CLDREPE CMPSBJNZ NOTMATCH ;不相等跳出,ZF=0 LEA DX,CRLF ;另取一行 MOV AH,09HINT 21H LEA DX,OUTPUT ;打印提示输出信息OUTPUTMOV AH,09HINT 21HJMP NEXTNOTMATCH:LEA DX,CRLF ;另取一行MOV AH,09HINT 21HLEA DX,ERR ;打印提示输出信息PASSERRORMOV AH,09HINT 21HNEXT: MOV AH,4CH ;返回DOS系统INT 21H
CODE ENDS
END START
二
用汇编语言编写程序,实现冒泡排序功能。要求,从屏幕输入15个100以内的数,用冒泡法对其从小到大排序,在屏幕上显示每一步排序的过程。排序功能用子程序实现。
请在答题时,按照以下格式填写内容:
1、程序源代码(包含必要的注释信息)
2、程序运行截图
贴一个链接,他的冒泡感觉有点怪我换成书上的了
冒泡参考代码
DATAS SEGMENT
SINPUT DB 'welecome and please input the 15 N:$'
SINPUTNUM DB 'please input the number with index number $'
SSHOWNUMDATA DB 'The contents of the array are: $'
SSHOWSORTNUM DB 'The contents of the sorted array are: $'
SSHOWINSORTNUM DB 'The contents IN the sorted array are: $'
BUF1 DB 20HDB 0DB 20H DUP(0)
NUM DW ?
N DW ?
NUMDATA DW 0FFH DUP(-1);最大容量256 DATAS ENDSSTACKS SEGMENT PARA STACKDW 30H DUP(0)
STACKS ENDSCODES SEGMENTASSUME CS:CODES,DS:DATAS,SS:STACKS
START:MOV AX,DATASMOV DS,AXMOV AH,09H ;显示字符串LEA DX,SINPUT ;取段内偏移地址INT 21H ;调用系统dos中断MOV DL,0DH ;回车换行MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H MOV NUM,4H ;赋值15 MOV AX,NUM; ;借用AX将键盘输入的NUM转给NMOV N,AX;;一个循环,实现数组读取MOV CX,N ;设置循环次数
L1:;这一段显示提示文字MOV AH,09H ;显示字符串LEA DX,SINPUTNUMINT 21H MOV BX,N ;总循环次数SUB BX,CX ;相减INC BX ;加一;此时BX为当前循环次数MOV NUM,BX ;当前数字存进去 CALL SHOWNUM ;调用显示数字子程序MOV DL,' ' ;传送字符MOV AH,2 ;显示一个字符INT 21H MOV DL,':' ;传送字符MOV AH,2 ;显示一个字符INT 21H MOV AH,0AH ;键盘输入到缓冲区LEA DX,BUF1 INT 21H CALL STOI ;调用输入处理子程序;借用AX将键盘输入的NUM转给NUMDATAMOV BX,N ;总循环次数SUB BX,CX ;相减;此时BX为当前循环次数MOV AX,NUM ;当前数字存进去MOV NUMDATA[BX],AX ;放进数组中 LOOP L1 ;循环MOV AH,09H ;显示原始字符串LEA DX,SSHOWNUMDATAINT 21H CALL SHOWNUMDATA ;调用子程序显示数组内容CALL SORTNUM ;调用冒泡排序算法MOV AH,09H ;显示字符串,排序后的数组为:LEA DX,SSHOWSORTNUMINT 21H CALL SHOWNUMDATA ;调用子程序显示数组内容;程序终止代码MOV AX,0MOV AH,4CHINT 21H;这是一段子程序,用来进行冒泡排序
SORTNUM PROCMOV CX,N ;设置大循环次数DEC CX ;总次数减一为外循环次数
OUTLP:MOV DX,CX ;DX内循环个数MOV BX,OFFSET NUMDATA
INLP:MOV AL,[BX] ;取前一个元素CMP AL,[BX+1] ;与后一个元素比较JNA NEXT ;前一个元素不大于后一个元素,则不进行交换XCHG AL,[BX+1] ;否则,进行交换MOV [BX],AL
NEXT:INC BX ;下一对元素DEC DXJNZ INLP ;内层循环PUSH AXPUSH BXPUSH CXPUSH DXMOV AH,09H ;显示字符串,排序中的数组为:LEA DX,SSHOWINSORTNUMINT 21H CALL SHOWNUMDATA ;调用子程序显示数组内容 POP DXPOP CXPOP BXPOP AXLOOP OUTLP ;外循环尾 RET
SORTNUM ENDP ;这是一段子程序,用来输入数字
STOI PROC;初始化MOV DX,0MOV BX,10MOV SI,2MOV NUM,0MOV AX,0
LOP:MOV AL,BUF1[SI] ;寄存器相对寻址,从缓冲区取一个字符CMP AL,0DH ;是否是CRJE FINAL ;等于就跳转,JNE相反SUB AL,30H ;减48,从ASCII码转数字CMP NUM,0 ;与0比较,相当于判断初始化JE DO_DEAL ;等于就跳转,JNE相反PUSH AX ;当前数字压入栈中MOV AX,NUM ;当前数送入运算寄存器中MUL BX ;隐含寻址,在AX中,相当于NUM乘以10MOV NUM,AX ;运算结果存进NUM中 POP AX ;之前的数据弹出
DO_DEAL:ADD NUM,AX ;加上之前的数据MOV AX,0 ;清零INC SI ;自加1JMP LOP ;跳转,处理下一个
FINAL:MOV DL,0DH ;回车换行MOV AH,2 INT 21H MOV DL,0AH MOV AH,2 INT 21H
RET
STOI ENDP;这是一段子程序,用来显示数字NUM
SHOWNUM PROC;第一位MOV BL,100 ;%先除100MOV AX,NUM ;送入运算寄存器DIV BL ;除法,AX隐含寻址ADD AL,30H ;商转换为ASCII码PUSH AX ;将余数先压入栈中CMP AL,30H ;看一看首位是不是0JE BITTWO ;若是,则不显示直接跳转到下一个MOV DL,AL ;传送字符MOV AH,2 ;显示一个字符INT 21H
BITTWO: POP AX ;将余数取出;第二位MOV AL,AH ;送入运算寄存器MOV AH,0 ;高位清零MOV BL,10 ;%再除以10DIV BL ;除法,AX隐含寻址ADD AL,30H ;商转换为ASCII码PUSH AX ;将余数先压入栈中CMP NUM,10 ;看一看数是不是小于10JB BITTTHREE ;若是,则不显示第二位直接跳转到末位MOV DL,AL ;传送字符MOV AH,2 ;显示一个字符INT 21H ;调用系统dos中断
BITTTHREE:POP AX ;将余数取出;第三位ADD AH,30H ;余数转换为ASCII码MOV DL,AH ;传送字符MOV AH,2 ;显示一个字符INT 21H ;调用系统dos中断RET ;子程序退出重置堆栈
SHOWNUM ENDP;这是一段子程序,用来显示数组NUMDATA
SHOWNUMDATA PROCMOV CX,N ;设置循环次数为数组大小MOV BX,0 ;循环计数
L4:PUSH BX ;将循环计数存入堆栈MOV AX,NUMDATA[BX] ;从数组中读取当前数字,一次取一个字,两个字节MOV AH,0 ;高位清零MOV NUM,AX ;将AX低位数据传送到NUMCALL SHOWNUM ;调用子程序显示数字MOV DL,',' ;传送字符MOV AH,2 ;显示一个字符INT 21H POP BX ;将循环计数从堆栈中取出INC BX ;计数自加1
LOOP L4 ;换行MOV DL,0DH ;CRMOV AH,2 ;显示一个字符INT 21H MOV DL,0AH ;LFMOV AH,2 ;显示一个字符INT 21H
RET ;子程序退出重置堆栈
SHOWNUMDATA ENDPCODES ENDSEND START