【任务】
在数据区,给定用0作为结束的字符串,请补充完成子程序,只保留字符串中的大写字母,并在最后一个大写字母后记录0作为所有大写字母构成的新字符串的结束。(以下面程序数据区中给出的字符串,最后得到的字符串为YTU后加0)
assume cs:cseg, ds:dseg, ss:sseg
sseg segment stack
dw 100h dup (?)
sseg ends
dseg segment
db 'YanTai University 264005', 0
dseg ends
cseg segment
start: mov ax, dseg
mov ds, ax
mov ax, sseg
mov ss, ax
mov sp, 100h
mov bx, 0
call getUpper
mov ax, 4c00h
int 21h
;子程序名:getUpper
;功 能:对从DS:bx开始,以0结束的字符串,只保留大写字母,并仍以0结束
;入口参数:DS和BX寄存器中保存字符串的起始地址
;出口参数:无
getUpper proc
; 请写出你的代码
ret
getUpper endp
cseg ends
end start
【参考解答】
assume cs:cseg, ds:dseg, ss:sseg
sseg segment stack
dw 100h dup (?)
sseg ends
dseg segment
db 'YanTai University 264005', 0
dseg ends
cseg segment
start: mov ax, dseg
mov ds, ax
mov ax, sseg
mov ss, ax
mov sp, 100h
mov bx, 0
call getUpper
mov ax, 4c00h
int 21h
;子程序名:getUpper
;功 能:对从DS:bx开始,以0结束的字符串,只保留大写字母,并仍以0结束
;入口参数:DS和BX寄存器中保存字符串的起始地址
;出口参数:无
getUpper proc
push ax
push si
push di
mov si,bx
mov di,bx
again: mov al,[si]
or al,al
jz ok
cmp al,'A'
jb next
cmp al,'Z'
ja next
mov [di],al
inc di
next: inc si
jmp again
ok: mov al, 0
mov [di], al
pop di
pop si
pop ax
ret
getUpper endp
cseg ends
end start