DATAS SEGMENT
MES DB 'Show a string as its hex:',0AH,0DH,'$'
MESS DB 'Moves string "source" to "target" successfully:',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
SD1 DB 64H
DB ?
DB 64H DUP(?)
LEN1 EQU $-SD1
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
MOV AH,09H ;显示提示信息输入一个字符串放到变量SD中
INT 21H
MOV DX, SEG SD
MOV DS, DX ;输入一个字符串放到变量SD中
MOV DX, OFFSET SD
MOV AH, 0AH
INT 21H
MOV SI,OFFSET SD
;SUB DH,DH ;将字符串的实际长度存于DX中
;MOV DL,SD+1
MOV DX,OFFSET MES2
MOV AH,09H ;回车换行
INT 21H
MOV DX, SEG SD
MOV DS, DX
MOV ES, DX ;利用串传送指令 MOVSB 将字符串从SD传到SD1
CLD
MOV SI,OFFSET SD+2
MOV DI,OFFSET SD1+2
MOV BX,1
MOV CX,LEN
REP MOVSB
MOV DX,OFFSET MESS
MOV AH,09H ;显示提示信息字符串传送成功
INT 21H
MOV DX,OFFSET MES
MOV AH,09H ;显示功能提示信息
INT 21H
MOV SI,OFFSET SD1+2 ;利用串读取指令LODSB
;MOV CX, LENGTH SD1 ;此时的CX可以没有作用因为DONE结束循环
MOV CX,LEN1 ;此时的CX可以没有作用因为DONE结束循环
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
MOV AH,4CH
INT 21H
CODES ENDS
END START