写了半天发现资料不多,放上来造福一下人类,主要题库的题也好多题解太少
一
用汇编语言编写程序,要求实现以下功能:
程序执行后,屏幕显示提示信息:“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 ENDS
STACK SEGMENT STACK
DW 20 DUP(0) ;在此输入堆栈段代码
STACK ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
LEA DX,INPUT ;打印提示输入信息INPUT
MOV AH,09H
INT 21H
LEA DX,BUFFER ;接收字符串BUFFER
MOV AH,0AH
INT 21H
MOV AL,BUFFER+1 ;对字符串进行处理
ADD AL,2
MOV AH,0
MOV SI,AX
MOV BUFFER[SI],'$'
LEA SI,BUFFER+2
PUSH DS
POP ES
LEA DI,PASS
MOV CX,0
MOV CL,BUFFER+1
CLD
REPE CMPSB
JNZ NOTMATCH ;不相等跳出,ZF=0
LEA DX,CRLF ;另取一行
MOV AH,09H
INT 21H
LEA DX,OUTPUT ;打印提示输出信息OUTPUT
MOV AH,09H
INT 21H
JMP NEXT
NOTMATCH:
LEA DX,CRLF ;另取一行
MOV AH,09H
INT 21H
LEA DX,ERR ;打印提示输出信息PASSERROR
MOV AH,09H
INT 21H
NEXT:
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 20H
DB 0
DB 20H DUP(0)
NUM DW ?
N DW ?
NUMDATA DW 0FFH DUP(-1);最大容量256
DATAS ENDS
STACKS SEGMENT PARA STACK
DW 30H DUP(0)
STACKS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
MOV AX,DATAS
MOV DS,AX
MOV 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转给N
MOV N,AX;
;一个循环,实现数组读取
MOV CX,N ;设置循环次数
L1:
;这一段显示提示文字
MOV AH,09H ;显示字符串
LEA DX,SINPUTNUM
INT 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转给NUMDATA
MOV BX,N ;总循环次数
SUB BX,CX ;相减
;此时BX为当前循环次数
MOV AX,NUM ;当前数字存进去
MOV NUMDATA[BX],AX ;放进数组中
LOOP L1 ;循环
MOV AH,09H ;显示原始字符串
LEA DX,SSHOWNUMDATA
INT 21H
CALL SHOWNUMDATA ;调用子程序显示数组内容
CALL SORTNUM ;调用冒泡排序算法
MOV AH,09H ;显示字符串,排序后的数组为:
LEA DX,SSHOWSORTNUM
INT 21H
CALL SHOWNUMDATA ;调用子程序显示数组内容
;程序终止代码
MOV AX,0
MOV AH,4CH
INT 21H
;这是一段子程序,用来进行冒泡排序
SORTNUM PROC
MOV 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 DX
JNZ INLP ;内层循环
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AH,09H ;显示字符串,排序中的数组为:
LEA DX,SSHOWINSORTNUM
INT 21H
CALL SHOWNUMDATA ;调用子程序显示数组内容
POP DX
POP CX
POP BX
POP AX
LOOP OUTLP ;外循环尾
RET
SORTNUM ENDP
;这是一段子程序,用来输入数字
STOI PROC
;初始化
MOV DX,0
MOV BX,10
MOV SI,2
MOV NUM,0
MOV AX,0
LOP:
MOV AL,BUF1[SI] ;寄存器相对寻址,从缓冲区取一个字符
CMP AL,0DH ;是否是CR
JE FINAL ;等于就跳转,JNE相反
SUB AL,30H ;减48,从ASCII码转数字
CMP NUM,0 ;与0比较,相当于判断初始化
JE DO_DEAL ;等于就跳转,JNE相反
PUSH AX ;当前数字压入栈中
MOV AX,NUM ;当前数送入运算寄存器中
MUL BX ;隐含寻址,在AX中,相当于NUM乘以10
MOV NUM,AX ;运算结果存进NUM中
POP AX ;之前的数据弹出
DO_DEAL:
ADD NUM,AX ;加上之前的数据
MOV AX,0 ;清零
INC SI ;自加1
JMP 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 ;%先除100
MOV AX,NUM ;送入运算寄存器
DIV BL ;除法,AX隐含寻址
ADD AL,30H ;商转换为ASCII码
PUSH AX ;将余数先压入栈中
CMP AL,30H ;看一看首位是不是0
JE BITTWO ;若是,则不显示直接跳转到下一个
MOV DL,AL ;传送字符
MOV AH,2 ;显示一个字符
INT 21H
BITTWO:
POP AX ;将余数取出
;第二位
MOV AL,AH ;送入运算寄存器
MOV AH,0 ;高位清零
MOV BL,10 ;%再除以10
DIV BL ;除法,AX隐含寻址
ADD AL,30H ;商转换为ASCII码
PUSH AX ;将余数先压入栈中
CMP NUM,10 ;看一看数是不是小于10
JB 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 PROC
MOV CX,N ;设置循环次数为数组大小
MOV BX,0 ;循环计数
L4:
PUSH BX ;将循环计数存入堆栈
MOV AX,NUMDATA[BX] ;从数组中读取当前数字,一次取一个字,两个字节
MOV AH,0 ;高位清零
MOV NUM,AX ;将AX低位数据传送到NUM
CALL SHOWNUM ;调用子程序显示数字
MOV DL,',' ;传送字符
MOV AH,2 ;显示一个字符
INT 21H
POP BX ;将循环计数从堆栈中取出
INC BX ;计数自加1
LOOP L4
;换行
MOV DL,0DH ;CR
MOV AH,2 ;显示一个字符
INT 21H
MOV DL,0AH ;LF
MOV AH,2 ;显示一个字符
INT 21H
RET ;子程序退出重置堆栈
SHOWNUMDATA ENDP
CODES ENDS
END START