EzioA 发表于 2016-2-27 12:22:40

实验10第一个问题的代码

为什么会在屏幕上面打印两行?第一行和第八行。还有,为什么程序不会自己终止??


代码:

assume cs:code, ss:stack, ds:data

data segment
        db 'Welcome to masm!',0
data ends

stack segment
        db 16 dup(0)
stack ends

code segment
start:        mov dh,8
                mov dl,3
                mov cl,2
                mov ax,data
                mov ds,ax
                mov ax,stack
                mov ss,ax
                mov sp,16
               
                call show_str
               
                mov ax,4c00H
                int 21H
               
show_str:       
                       
                        mov si,0
                        mov di,1
                        mov ax,0B800H
                        mov es,ax
                        mov al,160                                        ;每行160个字节
                        mul dh                                                ;用ax存储前8行所有字节数
                        mov bx,ax                                        ;用bx定位第8行
                        mov dh,0
                        add dl,dl
                        add bx,dx                                        ;把dx加到bx上,用bx定位第8行第3列
                        mov ch,0
                       
        print:        push cx
                        mov cl,
                        jcxz ok                                                ;判断指向数据是否为0
                        pop cx                                                ;恢复cl的数据
                        mov al,                                        ;取指向的数据存储在al中
                        push si
                        add si,si
                        mov es:,al                        ;存储显示的字符
                        mov es:,cl                        ;存储字符的属性
                        pop si
                        inc di
                        inc di                                                ;di自增两次,指向下一个属性字节
                        inc si
                       
                        jmp near ptr print
                       
        ok:        ret
code ends
end start

EzioA 发表于 2016-2-29 08:46:30

有懂的大神吗。。。{:10_243:}

n0noper 发表于 2016-3-9 09:35:23

撸主,你OK: ret 之前,是不是犯了个错?是不是push cx之后就不管人家了?堆栈不平衡了,ret的时候弹出来的是02(对应这一句:mov dl,3),总是死循环了···
OK:
    pop cx
    ret

然而我试了一下,可以了。撸主有问题再贴图,一起讨论。

EzioA 发表于 2016-3-10 12:45:54

n0noper 发表于 2016-3-9 09:35
撸主,你OK: ret 之前,是不是犯了个错?是不是push cx之后就不管人家了?堆栈不平衡了,ret的时候弹出来的 ...

谢谢啦!终于解决了!就是说只要用到栈段,push 和 pop 必须成对出现才不会有错误吧。
页: [1]
查看完整版本: 实验10第一个问题的代码