王爽《汇编语言第二版》第11章 实验11

王爽《汇编语言第二版》第11章 实验11

本章的实验比较简单,但是还是贴在这里吧。
编写一个子程序,将包含任意字符,以0结尾的字符串中的小写字母转变成大写字母,描述如下。
名称:letterc
功能:将以0结尾的字符串中的小写字母转变成大写字母
参数:ds:si指向字符串首地址
 
代码:
letterc
DATAS SEGMENT
    db 
"Beginner's All-purpose Symbolic Instruction Code.",0 
DATAS ENDS

STACKS SEGMENT
    ;此处输入堆栈段代码
    dw 
16 dup (0)
STACKS ENDS

CODES SEGMENT
    ASSUME CS:CODES,DS:DATAS,SS:STACKS
START:
    MOV AX,DATAS
    MOV DS,AX
    mov ax,STACKS
    mov ss,ax
    mov sp,
32
    
    mov si,
0
    mov cl,72h
    mov dx,50ah   
    call show_str    
    
    call letterc
    
    mov cl,74h
    mov dx,60ah   
    call show_str  
    
    MOV AH,4CH
    INT 21H
    ;名称letterc
    ;功能:将以0结尾的字符串中的小写字母转变成大写字母
    ;参数:ds:si指向字符串首地址
    letterc:
    pushf
    push cx
    push si
    sub cx,cx
    let:
    mov cl,[si]
    jcxz letok
    cmp cl,
'a'      
    jb 
continue
    cmp cl,
'z'
    ja 
continue
    sub cl,20h
    mov [si],cl
    
    
continue:
    inc si
    jmp let
    
    letok:
    pop si
    pop cx
    popf
    ret
    
    ;名称:show_str
    ;功能:在指定位置,用指定的颜色,显示一个用0结束的字符串
    ;参数:(dh)
=行号,(dl)=列号,(cl)=颜色,ds:si指向字符串的首地址
    show_str:
    push ax
    push cx
    push dx    
    push es        
    push si
    push di
        
    ;根据行号设置基址为bp
    mov ax,
160
    mul dh
    mov bp,ax
    ;根据列号设置基址为di
    mov dh,
0
    add dx,dx    ;没个字符对应2个字节,所以列号
*2
    mov di,dx   
    ;显存段地址
    mov ax,0b800h
    mov es,ax      
    ;保存颜色属性到al中
    mov al,cl
    
    sub cx,cx
    s:
    mov cl,[si] ;取字符
    jcxz ok
    mov es:[bp
+di],cl  ;写字符
    mov es:[bp
+di].1,al ;设置颜色属性
    add di,
2
    inc si
    loop s
    ok:
    pop di
    pop si
    pop es
    pop dx
    pop cx
    pop ax
 
    ret
CODES ENDS
    END START
运行结果:
 
在上面的代码中,为了将变换后的结果显示出来,我还引入了show_str子程序,以显示字符串内容。

你可能感兴趣的:(王爽《汇编语言第二版》第11章 实验11)