汇编语言第三版- 实验11 编写子程序

实验 11 编写子程序

编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母,描述如下。
名称:letterc
功能:将以0结尾的字符串中的小写字母转变成大写字母
参数:ds:si指向字符串首地址
应用举例:
    assume cs:codesg
    datasg segment 
        db "Beginner's All-purpose Symbolic Instruction Code.",0 
    datasg ends
    codesg segment
    begin:  mov ax, datasg
            mov ds, ax
            mov si, 0
            call letterc
            mov ax, 4c00H
            int 21H
    letterc:    ?
                
    codesg ends
    end begin

分析:

1.数据段datasg中定义的数据除了有大小写字母外还有标点符号。
2.判断是否结尾,用jcxz(CX=0)即跳转。
3.只需将字符串的小写转大写,小写大写的ASCII都是连续的,可用条件跳转。
4.优化程序,将结果显示在屏幕上。

代码如下:

# 编写一个子程序,将包含任意字符,以 0 结尾的字符串中的小写字母转变成大写字母
assume cs:codesg

datasg segment
    db "Beginner;s All-purpose Symbolic Instruction Code.",0  ;49长度 加上结尾的0等于50
datasg ends

codesg segment
     start:  mov ax,datasg
             mov ds,ax
             mov si,0
             call letterc    ; 转换大写子程序
             call display    ; 通用子程序,将内容显示在屏幕上
             mov ax,4c00h
             int 21h

    letterc: push cx
             push si
             push ax
            
         s0: mov cl,[si]   ; 取值
             mov ch,0
             jcxz ok       ; 如果是0 跳转到ok子程序,表示字符串结尾

             cmp cl,'a'  ; 比较
             jb next      ; 如果当前字符小于a 

             cmp cl,'z'
             ja next      ; 如果大于z

             ; 经过层层筛选,当前字符在a~z之中
             jmp short conversion

       next: inc si     ; 下一个
             jmp short s0 


 conversion: and cl, 11011111B
             mov [si],cl
             jmp next ;转换完成 继续下一个           

         ok: pop ax 
             pop si
             pop cx
             ret     


    display: push si
             push cx
             push di
             push ax
             push es
             push bx      ; 子程序中用到的寄存器都压栈

             mov si,0
             mov di,0

             mov ax,0b800h    ;0b8000h ~ 0b8f9fh 中的4000个字节的内容会出现在显示器上
             mov es,ax
             mov bx,140h      ;140h表示第三行,总共25行 (80*25)
             add bx,0ah       ;从第10列开始显示
             mov al,6         ;颜色

         s1: mov cl,ds:[di]   ; 取值 (低位存字符)
             mov ch,0
             jcxz exit
             mov ch,al        ; 高位存字符属性

             mov es:[bx+si],cx  ;cx低位cl是ds:[di]中的字符,高位ch是红底高亮绿字

             add si,2
             inc di
             jmp s1

       exit: pop bx
             pop es
             pop ax
             pop di
             pop cx
             pop si
             ret
codesg ends
end start


你可能感兴趣的:(汇编语言第三版- 实验11 编写子程序)