汇编语言学习2020年5月31

答案参考
从键盘接收一串字符,并另起一行逆序显示该字符串。

;可以这样考虑:
;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

你可能感兴趣的:(汇编语言)