. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  做实验10.1编写子程序遇到的问题,分享  [待解决] 回复[ 1次 ]   点击[ 263次 ]  
wylb733288
[帖 主]   [ 发表时间:2019-11-05 12:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2019-11-05 12:13
这个程序给定的一些数据:dh行号8,dl 列号3,cl 为显示颜色2
要求在屏幕8行3列显示"Welcome to masm!",结尾0.
这题目显然要求进行字符是否等于0判断,需要用到jcxz命令。而cl用来显示颜色,那么显然不需要用loop 指令。
在做些题犯的错误是:1、把3列当做起始显示值来做为内存偏移地址,而第三列起始值应为4,所以dl +1

                                   2、用了loop指令,本题因为把cl作为颜色显示值,用loop指令会改变cl,所以循环用jmp进行跳回进行赋值。
以下代码,运行能正常显示到屏幕。
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:        mov ax,0B800h

                        mov es,ax

                        mov ch,0
                        


                        call h_l ;调用子程序获取bx值,也就是160*8+4,注意这句不要放到循环体中

s:                        push cx

                        mov cl,[si]  ;将内存中的数值依次存入cl中,当cl=0时,执行ret

                        jcxz ok  ;用来判断cx=0如果是,跳转
                        mov di,1
                        mov es:[bx],cl
                        pop cx
                        mov es:[bx+di],cl
                        inc si
                        inc di
                        add bx,2
                        jmp short s 
ok:                        ret

h_l:                        mov al,160
                        mul dh
                        add al,dl
                        add al,1
                        mov bx,ax
                        ret
code ends
end start
wylb733288
[第1楼]   [ 回复时间:2019-11-05 13:12 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2019-11-05 12:13
发现自己代码的一个错误,在最后的jcxz跳转时,因为栈中push cx,把cx的值覆盖了call指令的ip,造成无法返回程序。
所以应在ok: 的ret前加一条pop cx.就能正常返回程序。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved