【任务】
在数据区,给定用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