您的位置:首页 > 编程语言

汇编程序:已知有一字符串STR,以'$'为结束标志,编写程序,把STR的内容复 制到NEW_STR中? 要求复制时(1)滤去所有非英文字符;(2)把大写字母变成小写;(3)统计新字符的长度放在NUM中

2016-12-29 17:57 1466 查看
assume cs: CODE, ds: DATA

DATA segment

STR db  '本程序将拷贝本字符串 STR。', 0Dh, 0Ah
db  '新字符串 NEW_STR 将滤去非 ASCII 字符,将大写字母改为小写。', 0Dh, 0Ah
db  '本字符串中共有 92 个 ASCII 字符。', 0Dh, 0Ah
db  '本程序采用 Microsoft MASM Professional Development System 6.11 版本。',0Dh, 0Ah, '$'
NEW_STR db  80h dup (?)
STR1    db  0Dh, 0Ah, 'NEW_STR 的长度是 0x', 4h dup (?), '。', '$'
NUM dw  ?


DATA ends

CODE segment

MAIN    proc
E:  mov ax, DATA
mov ds, ax
mov es, ax
lea dx, STR
call INT9
lea si, STR     ;DS:SI
lea di, NEW_STR     ;ES:DI
xor cx, cx
NEXT1:  mov al, [si]
cmp al, '$'
jz FINISH
cmp al, 7Fh
ja NEXT0            ;>7Fh为非ASCII字符
cmp al, 'A'
jb MOVE
cmp al, 'Z'
ja MOVE
add al, 20h
MOVE:   mov [di], al
inc cx
inc di
NEXT0:  inc si
jmp NEXT1
FINISH: mov NUM, cx
mov byte ptr [di], '$'
lea dx, NEW_STR
call INT9
call LENGT
lea dx, STR1
call INT9
mov ax, 4C00h
int 21h
MAIN    endp

INT9    proc
mov ah, 9h
int 21h
ret
INT9    endp

LENGT   proc                ;将NEW_STR的长度写入STR1的子程序
lea di, STR1
add di, 15h     ;移动到'length=0x'后面
mov bx, 0F000h
mov cl, 0Ch     ;右移12位,即十六进制的3位
L3: mov ax, NUM
and ax, bx      ;取当前十六进制位数字
shr ax, cl
cmp ax, 9h
ja L0           ;数字A-F,>9
add al, '0'     ;数字0-9
jmp L1
L0: add al, 37h     ;'A'-0xA
L1: mov [di], al
cmp cl, 0h
jz L2           ;字符串已生成
inc di
sub cl, 4h
push cx
mov cl, 4h
shr bx, cl
pop cx
jmp L3
L2: ret
LENGT   endp


CODE ends

end E

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  汇编 ascii
相关文章推荐