汇编网首页登录博客注册
sissim的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
友情链接

[2009-11-19 16:29] 实验10 第1题

1.显示字符串

做这个程序,出现了两个比较大的问题。总结如下:
第一,居然忘记设置段地址,直接将字符放到计算好的地址中,这样默认的段地址在ds中,导致屏幕无字符显示。
第二,一开始在ok标号处,直接就是ret指令,这是程序死循环。经过追踪程序,发现显示完字符串,取到0,转ok,这时ip又回到0002执行。这才意识到,执行ret之前,栈顶是刚才存入的cx的值,而不是返回地址(那一串push和pop是最后才加的)。

程序如下:
        assume  cs:code
data    segment
        db      'Welcome to masm!',0
data    ends
code    segment
start:  mov     dh,8
        mov     dl,3
        mov     cl,2
        mov     ax,data
        mov     ds,ax
        mov     si,0
        call    show_str
        mov     ax,4c00h
        int     21h

show_str:
        push        ax
        push        bx
        push        cx
        push        dx
        push        si
        push        es
        dec     dh                ;行号减一
        mov     al,0a0h
        mul     dh                ;0a0h*(行号-1)
        mov     dh,0
        dec     dl
        add     dx,dx                ;2*(列号-1)
        add     ax,dx                ;0a0h*(行号-1)+2*(列号-1)
        mov     bx,ax
        mov     ch,0                ;ch清零,为cx进栈(颜色)做准备
        mov     ax,0b800h
        mov     es,ax                ;显存段地址
s:      push    cx                ;颜色进栈
        mov     cl,[si]                ;取出一个字符
        jcxz    ok                ;是零则返回
        mov     es:[bx],cl        ;不是零,放显存相应单元
        inc     bx
        pop     cx                ;取回颜色
        mov     es:[bx],cl        ;存颜色
        inc     bx
        inc     si
        jmp     short s                ;修改指针并循环
ok:     pop     cx                ;返回前,将刚才进栈的cx出栈,使栈顶指针指向返回地址
        pop        es
        pop        si
        pop        dx
        pop        cx
        pop        bx
        pop        ax
        ret
code    ends
        end     start
评论次数(0)  |  浏览次数(573)  |  类型(汇编作业) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码