答案参考
从键盘接收一串字符,并另起一行逆序显示该字符串。
;可以这样考虑:
;1.利用DOS 21H中断的A号功能,读取一个字符串,这样可以取得字符串的长度N。
;2.MOV CX,N,利用LOOP指令,倒序输出字符串。
;代码如下:
; MULTI-SEGMENT EXECUTABLE FILE TEMPLATE.
DATA SEGMENT
BUF0 DB 255 ;字符串最大长度
DB 0 ;输入的字符串的实际长度
BUF1 DB 255 DUP(0)
LF DB 0DH, 0AH, '$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE, DS:DATA
START:
MOV AX, DATA
MOV DS, AX
LEA DX, BUF0 ;READ A STRING
MOV AH, 0AH ;
INT 21H ;
LEA DX,LF ;输出回车换行
MOV AH,9 ;
INT 21H
XOR CX,CX
MOV CL,BUF0+1 ;CX存入字符串长度,循环计数
MOV BX,CX
MOV AH,0EH ;10H中断,0EH子功能,输出AL中的字符
L1: DEC BX
MOV AL,BUF1[BX]
INT 10H
LOOP L1
MOV AX, 4C00H
INT 21H
CODE ENDS
END START
从键盘输入 1 字节得两位十六进制数据, 并分别用 二进制、 八进制、 十进制、十六进制显示出 来其等价得值
DATA SEGMENT
PLEASE DB 'PLEASE INPUT(0-F):',0DH,0AH,24H ;提示信息,意思是请输入0-F之间的十六进制数。
LERROR DB 'INPUT ERROR,PLEASE RESET INPUT:',0DH,0AH,24H;错误提示信息,由于本人英文水平不佳,如有单词错误,各位见笑了!
HEX1 DB ? ;这个变量用于存放输入的值(<=9),由于0-9的ASCII值十六进制和十进制是一样的,所以接收输入的数后,可以直接存放在这,用于显示。
HEX2 DB ?,?,0DH,0AH,24H;此变量用于存放接收到的A-F的ASCII,并经转化为十六进制数以后,再转化为两位十进制的值(最终存放的是两位十进制数的ASCII值)
CS1 DB 10,1 ;除数,用于A-F之间的十六进制数转化为两位十进制数。
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
MOV AH,9
LEA DX,PLEASE
INT 21H ;为了界面友好,首先显示提示信息。
INPUT:
MOV AH,1
INT 21H ;楼主,你懂的!
CMP AL,'0' ;这一小段用于检测输入的数是否超范围。
JB ERROR ;小于0,转错误提示,并要求重新输入。
MOV AH,AL
CMP AL,'9'
JBE SAVE1 ;大于零,且小于等于9,直接将ASCII码存放于HEX1变量。
AND AL,0DFH ;将输入的小写转化为大写。相当于SUB AL,20H
CMP AL,'A'
JB ERROR ;小于A,转错误处理。
MOV AH,AL
SUB AH,'A'-10 ;以上两行,假设为A-F,则将ASCII形式转为十六进制数。
CMP AL,'F'
JBE SAVE2 ;大于A,小于F,转保存到HEX2变量处理。
ERROR:
MOV AH,2
MOV DL,0AH
INT 21H
MOV DL,0DH
INT 21H ;你懂的,这是换行回车。
MOV AH,9
LEA DX,LERROR
INT 21H
JMP INPUT ;这一小段,显示错误提示信息,并转到开始处,要求重新输入。
SAVE1:
MOV HEX1,AH
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
MOV DL,HEX1
INT 21H ;这一小段为显示0-9之间的十进制数的ASCII码,显示完退出程序。
JMP EXIT
SAVE2:
PUSH AX ;先保存AX的值
MOV AH,2
MOV DL,0DH
INT 21H
MOV DL,0AH
INT 21H
MOV CX,2 ;设置循环次数为2次
LEA SI,CS1 ;将除数的首地址送出SI
LEA DI,HEX2 ;将要存入的十进制ASCII码的变量的首地址送入DI
POP AX ;恢复AX的值
MOV AL,AH ;将十六进制数送入AL,作被除数
ZHW10:
XOR AH,AH
DIV BYTE PTR[SI]
ADD AL,30H
MOV [DI],AL
INC SI
INC DI
MOV AL,AH
LOOP ZHW10 ;这一小段,用于将十六进制数转化为十进制数并将每一位变为ASCII码后存入变量HEX2
MOV DX,OFFSET HEX2
MOV AH,9
INT 21H ;以ASCII码形式显示A-F转化后的十进制数。
EXIT:
MOV AH,4CH
INT 21H
CODE ENDS
END START
假设密码为“123456” , 从键盘接收密码并验证, 若正确则显示“欢迎使用本系统” , 否则显示“密码错误, 您无权使用 !”。
DATA SEGMENT
GETS DB 21,0,21 DUP(?)
OUTR DB 0DH,0AH,"Welcome to use this system!$"
OUTE DB 0DH,0AH,"The password is wrong, you have no right to use it!$"
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA
START:
MOV AX,DATA
MOV DS,AX
LEA DX,GETS
MOV AH,0AH
INT 21H
MOV CL,GETS+1
CMP CL,6
JNE NOTEQUAL
MOV CH,30H
MOV AH,0
LEA BX,GETS+2
AGAIN:
CMP AH,6
JE EQUAL
INC AH
INC CH
MOV CL,[BX]
CMP CL,CH
JNE NOTEQUAL
INC BX
JMP AGAIN
NOTEQUAL:
LEA DX,OUTE
MOV AH,9
INT 21H
JMP DONE
EQUAL:
LEA DX,OUTR
MOV AH,9
INT 21H
DONE:
MOV AH,4CH
INT 21H
CODE ENDS
END START