美文网首页
汇编语言第三版- 实验11 编写子程序

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

作者: pingerbufan | 来源:发表于2018-06-21 15:13 被阅读0次

    实验 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 编写子程序

          本文链接:https://www.haomeiwen.com/subject/hsgqyftx.html