. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->标志寄存器
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验11  [待解决] 回复[ 1次 ]   点击[ 391次 ]  
kingwrcy
[帖 主]   [ 发表时间:2009-04-16 10:30 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2007-12-10 17:12
没啥难度.贴出代码.

assume cs:code

data segment

        db "Beginner's All-purpose Symbolic Instruction Code. ",0

data ends

tmp_data segment

        db 51 dup (0)

tmp_data ends

code segment
                  begin:mov ax,data
                        mov ds,ax
                        mov si,0
                        mov ax,tmp_data    ;临时存放转化后的字符串.最后用movsb传送到ds:si处覆盖原字符串
                        mov es,ax
                        
                        call letterc
                        
                        mov ax,4c00h
                        int 21h
                        
                        
                        
        letterc:
        ;=================================================================        
        ;功能:将以0结尾的字符串中的小写字母转变为大写字母
        ;ds:si指向字符串的首地址
        ;=================================================================        
        
        ;ascii中.字母小为97(a)-122(z),大写->小写,+20H
        
                        mov di,0
                      s:        
                        mov ch,0
                        mov al,ds:[si]
                        mov cl,al
                        jcxz all_done   ;如果为0则转化完成
                        mov es:[di],al  ;不管是不是小写字母.先移到es段
                        cmp al,97
                        jnb ok_1        ;大于或等于97就跳
                        
                        jmp next        ;小于97. 说明不是小写字母.跳下一个
                     ok_1:cmp al,122      ;小于或等于122就跳
                        jna ok_2        ;大于122.说明不是小写字母.跳下一个
                        jmp next
                   ok_2:                ;执行到这里说明是小写字母.开始转换
                         sub al,20H      ;小写字母-32=大写字母.
                         mov es:[di],al  ;送es段.
                   next:inc si
                         inc di
                         jmp short s
               all_done:                ;全部完成.传送到ds段
                        push es         ;交换ds和es段
                        push ds
                        pop es        
                        pop ds          ;ds:si指向转换完成后的字符串
                        
                        mov dh,10
                        mov dl,10
                        mov cx,2        ;调用show_str打印在8行8列绿色的字.
                        call show_str
                        ret
show_str:
        ;=============================================================================== 
        ;功能:显示ds段开始的字符串在dh行。dl列。样式为cl,字符串以0结尾 
         ;参数:ds段 
         ;返回值:无 
         ;===============================================================================
                   push dx
                   mov al,0A0H        ;一行160个字节
                    dec dh             ;行数从0开始.所以dh-1
                   mul dh             ;一共160*(dh-1)个字节
                    mov bx,ax          ;送bx
                   mov al,2           ;一列2个字节
                   mul dl             ;一共2*dl个字节
                   sub ax,2           ;列也是从0开始.并且字符放奇数位.所以ax-2
                   add bx,ax          ;行列相加
                   mov ax,0B800H      ;基址为0B800H
                   mov es,ax          ;送es
                   mov si,0         
                   mov ch,0                  ;高位置0
                   mov di,0
                   mov ax,cx           ;保存样式到ax
   show_str_s:
                   mov cl,[di]         ;送cx
                   jcxz ok           ;判断是否到字符串尾,是则返回.否则继续
                    mov es:[bx+si],cl   ;奇数位,字符串                 
                    mov es:[bx+si+1],al ;偶数位,样式
                    inc di
                    add si,2
                    jmp short show_str_s
                 ok:
                    pop dx
                    ret

code ends
end begin
abob
[第1楼]   [ 回复时间:2009-04-17 14:31 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
就是^_^,比第十章简单多了~
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved