. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->标志寄存器
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  实验11答案完整版  [待解决] 回复[ 13次 ]   点击[ 809次 ]  
dadimamiily
[帖 主]   [ 发表时间:2011-09-15 08:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-09-01 07:12
;编写一个子程序,将包含任意字符,以〇结尾的字符串中的小写字母转变成大写字母
;参数:ds:si指向字符串首地址
;子调用程序的设计如下:
;s循环:判断字符是否为0,是0则停止,非0则跳转到p0处判断大小
;p0:判断x是否>=61H,是则跳转到p1处再判断,不是则跳出判断读取下一个数据x
;p1:判断x是否<=7aH,是则跳转到t0处开始转换,不是则跳出判断取下一个数据x
;s循环结束
;t0:因为小写字母的a码比大写的a码大20H,故x的值-20H,结果存入栈中,最后一个数
;    入一个0进栈,为以后显示打基础。

assume cs:code
data segment
 db "Beginner's All-purpose Symbolic Instruction Code.",0
data ends
stack segment
     dw 80 dup (0)
stack ends

code segment
start: 
      mov ax,data
      mov ds,ax
      mov ax,stack
      mov ss,ax
      mov sp,0a0h 
      mov si,0
      call letter
      mov dh,21 ;行号
      mov dl,1 ;列号
      call show
      mov ax,4c00h
      int 21h
letter:
       mov ch,0
       mov cl,ds:[si]
       jcxz ok
       mov al,ds:[si]
       cmp al,61H
       jnb p1
       inc si
       jmp short letter
    p1:
       cmp al,7aH
       jna t0
       inc si
       jmp short letter
    t0:sub al,20H
       mov ds:[si],al
       inc si
       jmp short letter      
    ok:
       ret
   ;****************show part*********************
    show:
       
         mov ax,0a0h ;算出行
         mul dh
         mov bx,ax
         mov ax,2h   ;算出列
         mul dl
         mov di,ax
         mov si,0 
         
         mov ax,0b800h
         mov es,ax
  change:mov cl,ds:[si]
         mov ch,0
         jcxz ok1               ;判断0结束字符
         push ds:[si]           ;把字符串放入栈中
         pop es:[bx].[di]       ;从栈中取出字符放入显示区的偶地址中
         mov ax,2               ;绿色属性
         mov es:[bx].[di].1,ax  ;颜色字符放入奇地址中
         add di,2
         inc si
         jmp short change
     ok1:
         ret
     ;**********************************************
code ends
end start
mantuluo
[第1楼]   [ 回复时间:2011-11-24 17:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-15 22:48
这么麻份,你还好意思写出来
tomato
[第2楼]   [ 回复时间:2011-11-24 20:54 ]   [引用]   [回复]   [ top ] 
荣誉值:405
信誉值:0
注册日期:2008-01-19 14:51
楼主是显示出来了。这道题好像不用显示出来,在debug下查看就可以了。
chinatree
[第3楼]   [ 回复时间:2011-11-25 05:45 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
回复:[第1楼]
-------------嫌麻烦?那你看书做什么?看书不麻烦吗?还得翻还得想,那你为什么要看书?人活着做什么?每天都有那么多鸡毛蒜皮的事,多麻烦呀。你回复之前怎么不问下你自己怎么好意思说出口了。
mantuluo
[第4楼]   [ 回复时间:2011-11-25 13:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-15 22:48
你是不是有精神系统的疾病呀,我只是说这个程序没必要写这么多代码,可以使其更简单,写代码不是只是写出来而已,要使其运算效率更高,更节省内存,注重代码质量,不懂别在这放屁,我只是提点建议,可能用词不太恰当,但我是好意。
chinatree
[第5楼]   [ 回复时间:2011-11-25 17:31 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
哦,那这个程序应该写成什么样.才能做到更简单,运算效率更高,更节省内存?
要知道,精简的代码也是要付出代价的.
593357681
[第6楼]   [ 回复时间:2011-12-15 18:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-12-15 17:59
在指定的位置,用指定的颜色,显示一个用0结尾的字符串,并把小写字母变为大写字母。请教
e56004474
[第7楼]   [ 回复时间:2012-01-05 17:18 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
回复:[第4楼]
------------------
实验11答案完整版

LZ 标题是完整版。  精简了对不起标题呐。。。
e56004474
[第8楼]   [ 回复时间:2012-01-21 23:04 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
;;;;;;;;;;;;;;;;;;;;;;;;;;;letterc子程序开始;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;功能:
;将以0结尾的字符串中的小写字母转变成大写字母
;参数:
;DS:SI指向字符串首地址
;返回: 无



letterc:
        pushf
        push ax
        push cx
        push si

        letterc1:
                mov ax,ds:[si]
                mov cx,ax
                jcxz letterc3

                cmp ax,61d
                jb  letterc2
                
                cmp ax,87d
                ja  letterc2
                        
                sub ax,20d
        letterc2:          
                mov table[si],ax
                inc si
                jmp        letterc1
        letterc3: 
                pop si
                pop cx
                pop ax
                pushf
                ret
;;;;;;;;;;;;;;;;;;;;;;;;;;;letterc子程序结尾;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
留个印。
折腾人,加深了对offset的认识。(offset好像只适用于在CS段中的标号)
e56004474
[第9楼]   [ 回复时间:2012-01-21 23:10 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:1
注册日期:2008-09-04 16:35
letterc2:           
                mov table[si],ax

改:
               MOV       ES:[DI],AX
wzhh1986
[第10楼]   [ 回复时间:2012-05-07 20:00 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2010-12-02 13:35
小写转化成大写的子程序不够简洁,不如这样写:
letterc:mov ch,0
        mov cl,[si]
        jcxz ok
        cmp cl,61h     
        jb next
        cmp cl,7ah
        ja next
        
        and cl,11011111b
        mov [si],cl

next:        inc si
        jmp short letterc
ok:        ret
wzhh1986
[第11楼]   [ 回复时间:2012-05-07 20:01 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2010-12-02 13:35
对了,一时间忘记保存寄存器的值了,只需要保存cx和si的值
wzhh1986
[第12楼]   [ 回复时间:2012-05-07 20:06 ]   [引用]   [回复]   [ top ] 
荣誉值:6
信誉值:2
注册日期:2010-12-02 13:35
8楼的不敢苟同,
letterc1: 
                mov ax,ds:[si] 
                mov cx,ax 
                jcxz letterc3 
注意段里面的每个字母只占8位,但你这里同时将2位字母赋给cx了,虽然你的程序最红结果或许是对的,但是这里逻辑上不妥当,不能让人一眼就能看明白,还是不要这样为好
dasa
[第13楼]   [ 回复时间:2017-07-20 11:13 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2017-07-20 09:18
mov dx,ds:[si]
mov cx,ax
如果最后的一个单字节是字母,高一个字节是0
那岂不是复制一个’字符‘、0了吗?比如:44 00    复制后ax=0044h,ax不为0,多出循环一次。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved