鱼C论坛

 找回密码
 立即注册
查看: 3299|回复: 3

实验10第一个问题的代码

[复制链接]
发表于 2016-2-27 12:22:40 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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


代码:

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,[si]
                        jcxz ok                                                ;判断[si]指向数据是否为0
                        pop cx                                                ;恢复cl的数据
                        mov al,[si]                                        ;取[si]指向的数据存储在al中
                        push si
                        add si,si
                        mov es:[bx+si],al                        ;存储显示的字符
                        mov es:[bx+di],cl                        ;存储字符的属性
                        pop si
                        inc di
                        inc di                                                ;di自增两次,指向下一个属性字节
                        inc si
                       
                        jmp near ptr print
                       
        ok:        ret
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-2-29 08:46:30 | 显示全部楼层
有懂的大神吗。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-3-9 09:35:23 | 显示全部楼层
撸主,你OK: ret 之前,是不是犯了个错?是不是push cx之后就不管人家了?堆栈不平衡了,ret的时候弹出来的是02(对应这一句:mov dl,3),总是死循环了···
OK:
    pop cx
    ret

然而我试了一下,可以了。撸主有问题再贴图,一起讨论。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢啦!终于解决了!就是说只要用到栈段,push 和 pop 必须成对出现才不会有错误吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 12:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表