DATAS SEGMENT
MES DB 'Show a string as its hex:',0AH,0DH,'$'
MES1 DB 'Please enter a string:',0AH,0DH,'$'
MES2 DB 0AH,0DH,'$'
MES3 DB 'Please choice a kind of operation: r = "restart";other character means = "quit";',0AH,0DH,'$'
SD DB 64H
DB ?
DB 64H DUP(?)
;LEN EQU $-SD ;求字符串实际长度值
DATAS ENDS
CODES SEGMENT
ASSUME CS:CODES,DS:DATAS
START:
restart:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET MES2 ;回车换行
MOV AH,09H
INT 21H
MOV DX,OFFSET MES1 ;显示提示信息输入一个字符串放到变量SD中
MOV AH,09H
INT 21H
MOV DX, SEG SD
MOV DS, DX
MOV DX, OFFSET SD ;输入一个字符串放到变量SD中
MOV AH, 0AH
INT 21H
MOV DX,OFFSET MES2 ;回车换行
MOV AH,09H
INT 21H
MOV DX,OFFSET MES ;显示功能提示信息
MOV AH,09H
INT 21H
MOV SI,OFFSET SD+2 ;利用串读取指令LODSB
MOV CX, LENGTH SD
Again: CLD
LODSB
OR AL, AL ;是否为结尾符号 0,是则退出循环
JZ DONE
AND AL,0F0H ;取 高4位
MOV CL,04h
SHR AL,CL
CMP AL,0AH ;是否是A以上的数
JB C2
ADD AL, 07H
C2: ADD AL, 30H
MOV DL, AL ;显示字符的高四位十六进制形式
MOV AH, 02H
INT 21H
CLD
DEC SI
LODSB
OR AL, AL ;是否为结尾符号 0,是则退出循环
JZ DONE
AND AL, 0FH ;取低4位
CMP AL, 0AH
JB C3
ADD AL, 07H
C3: ADD AL, 30H
MOV DL, AL ;显示字符低四位的十六进制形式
MOV AH, 02H
INT 21H
LOOP Again
DONE:
MOV AX,DATAS
MOV DS,AX
MOV DX,OFFSET MES2 ;回车换行
MOV AH,09H
INT 21H
MOV AX,DATAS ;显示提示信息输入选择相应操作
MOV DS,AX
MOV DX,OFFSET MES3
MOV AH,09H
INT 21H
MOV AH,01H ;输入字符选择相应功能
INT 21H
CMP AL,'r'
jz restart
MOV AX,4C00H ;返回DOS
INT 21H
CODES ENDS
END START