| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1097 人关注过本帖
标题:一个有趣的现象,入栈了不会出栈!!!
只看楼主 加入收藏
powlin1991
Rank: 2
等 级:论坛游民
帖 子:51
专家分:22
注 册:2012-2-22
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:11 
一个有趣的现象,入栈了不会出栈!!!
一下程序,希望个位指教,有详细注释!!!程序就是把data中的数据在显存8行3列用绿色显示,遇到0就退出。

;小疑问:程序中没有使用栈,但是没有错误,难道内存自动定义一个栈?
;在s2下面还有一个小错误。。。整个程序还存在两个警告!!!
assume cs:code
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
    mov si,0
    mov bx,0        ;自己加的寄存器,貌似原代码没有bx
    call show        ;跳转指令

    mov ax,4c00h        ;返回指令
    int 21h

show:   
    mov ax,0B800h        ;显存段地址
    mov es,ax
    mov al,160        ;每行160个字节
    mul dh            ;8位运算,储存在ax中
    mov bx,ax        ;寄存相乘后的结果,作为es的偏移地址使用
    add bx,160        ;加160是因为显示器貌似不是从第一行开始显示的

   s2:    push cl            ;cl入栈是为了保存颜色
    mov ch,0        ;让ch赋值为0
    mov cl,ds:[si]        ;把数据段中的字节赋值到cl中
    jcxz s1            ;cx不为0,则继续向下运行,否则跳转到s1
    mov es:[bx + 4],cl    ;把cl赋值到显存
    pop cl            ;将保存的颜色出栈,准备使用            (但是貌似没有出栈,运行后的颜色各不相同)
    mov ch,cl;    mov ch,2;    ;颜色保存到ch中(想不通为什么这里写mov ch,2就是对的,这样写就是错的。。。)
    mov es:[bx + 5],ch    ;ch赋值给高位(高位保存颜色,低位保存字节)
    inc si
    add bx,2
    loop s2            ;s2循环

s1:    ret            ;跳到返回指令处

    code ends
    end start
搜索更多相关主题的帖子: Welcome 
2012-04-09 13:06
powlin1991
Rank: 2
等 级:论坛游民
帖 子:51
专家分:22
注 册:2012-2-22
收藏
得分:0 
子程序我是刚碰到,可能格式上会有些问题,但是麻烦各位先看下为什么颜色会出问题,多谢了~~~!
2012-04-09 13:09
powlin1991
Rank: 2
等 级:论坛游民
帖 子:51
专家分:22
注 册:2012-2-22
收藏
得分:0 
z版z版,我好不容易上来发个帖啊- -
2012-04-09 16:48
zklhp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:china
等 级:贵宾
威 望:254
帖 子:11485
专家分:33241
注 册:2007-7-10
收藏
得分:4 
可惜我不会啊。。
2012-04-09 19:32
powlin1991
Rank: 2
等 级:论坛游民
帖 子:51
专家分:22
注 册:2012-2-22
收藏
得分:0 
回复 4楼 zklhp
这,你。。。不会。。。这个不难的嘛。
2012-04-09 20:59
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:2 
show:   //这里显然没有冒号
    mov ax,0B800h        ;显存段地址
 

最基础的往往是你最容易忽略的!
2012-04-09 22:25
powlin1991
Rank: 2
等 级:论坛游民
帖 子:51
专家分:22
注 册:2012-2-22
收藏
得分:0 
回复 6楼 于祥
楼上弄错了吧?我这里的show表示一个标号,怎么能没有冒号呢。。。

话说我知道自己错在哪里了,就是入栈和出栈应该对字操作,但是我对字节操作是不可行的。
还有入栈和出栈的顺序有些问题,所以导致了错误。

反思:以前对call和ret的认识只局限于循环这个层面,但是总是忽略入栈和出栈,这个程序做了以后就加深了对这些关键词的理解。

贴上改正代码如下,望大家指教:

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        ;跳转指令
    mov ax,4c00h        ;返回指令
    int 21h

show:   
    mov bx,0
    push cx
    mov ax,0B800h        ;显存段地址
    mov es,ax
    mov al,160        ;每行160个字节
    mul dh            ;8位运算,储存在ax中
    mov bx,ax        ;寄存相乘后的结果,作为es的偏移地址使用
    add bx,160        ;加160是因为显示器貌似不是从第一行开始显示的

    dec dl            ;列减1
    mov al,2        ;做乘法
    mul dl            ;第三列在第四字节上,(3-1)*2 = 4
    add bx,ax        ;bx作为显示第一个字节的偏移地址

   s2:    mov ch,0        ;让ch赋值为0
    mov cl,ds:[si]        ;把数据段中的字节赋值到cl中
    jcxz s1            ;cx不为0,则继续向下运行,否则跳转到s1
    mov es:[bx],cl        ;把cl赋值到显存
    pop cx            ;将保存的颜色出栈,准备使用            (但是貌似没有出栈)
    mov es:[bx + 1],cl    ;cl赋值给高位(高位保存颜色,低位保存字节)
    inc si            ;数据段中的偏移地址加1
    add bx,2        ;显存中偏移地址加2
    push cx            ;cx入栈,循环了以后出栈
    jmp s2            ;s2循环

s1:    pop cx            ;没有写这句话,栈中还有其他数据,所以先出来的不是IP
    ret            ;跳到返回指令处

    code ends
    end start
2012-04-10 12:28
于祥
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:5
帖 子:1047
专家分:4132
注 册:2011-4-24
收藏
得分:2 
程序代码:
call show        ;跳转指令   //这里是子程序调用





 show:   //这里能有冒号?这里是子程序入口吧?
     mov ax,0B800h        ;显存段地址
 

最基础的往往是你最容易忽略的!
2012-04-10 13:05
powlin1991
Rank: 2
等 级:论坛游民
帖 子:51
专家分:22
注 册:2012-2-22
收藏
得分:0 
回复 8楼 于祥
我感觉,子程序说调用貌似不是很贴切,(但貌似都这么说)call就是执行了两个过程,IP入栈和跳转,执行跳转的时候就是需要知道哪个标号的啊,没有冒号这么行。。。
2012-04-10 13:59
yahwei
Rank: 7Rank: 7Rank: 7
来 自:湖~
等 级:黑侠
威 望:3
帖 子:145
专家分:644
注 册:2011-11-10
收藏
得分:2 
回复 7楼 powlin1991
pop cx            ;将保存的颜色出栈,准备使用            (但是貌似没有出栈)
    mov es:[bx + 1],cl    ;cl赋值给高位(高位保存颜色,低位保存字节)
如果没有出栈,cl从哪里来的值传给高位呢?关于出栈的操作,书上的解释是说:sp=sp+2,但里面的内容不会清空,直到下次有数据入栈才会覆盖原数据。

[qq]949654600[/qq]
2012-04-10 22:12
快速回复:一个有趣的现象,入栈了不会出栈!!!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.019151 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved