鱼C论坛

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

[已解决]关于进栈和处栈顺序的问题

[复制链接]
发表于 2017-9-18 21:59:17 | 显示全部楼层 |阅读模式

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

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

x
该问题是实验10第3问显示数值的问题

这里有两个差不多一样的代码,就是子程序dtoc进栈和处栈顺序不一样的问题,如下:
(1)
assume cs: code 

data segment 

        db 10 dup (0)
        
data ends 

code segment 

start : mov ax, 12666
                mov bx, data 
                mov ds, bx 
                mov si, 0
                call dtoc
                
                mov dh, 8
                mov dl, 3
                mov cl, 2
                call show_str 
                
                mov ax, 4c00H
                int 21H
                
dtoc :  push ax  
                push bx 
                push cx 
                push dx 
                push si 
                push di
                        
                mov di, 0
d10 :   mov dx, 0
                mov bx, 10
                div bx  
                
                add dx, 30H
                push dx 
                inc di
                mov cx, ax
                jcxz d11
                
                jmp d10 
                
d11:         mov cx, di
d12:         pop dx  
                mov [si], dl 
                inc si 
                
                loop d12
                
                mov dl, 0
                mov [si], dl 
                
                
                
                        
okay:         pop si
                pop di  
                pop dx 
                pop cx 
                pop bx 
                pop ax 
                
                ret 
                        
show_str:mov bx, 0
                mov ax, 0b800H
                mov es, ax 
                dec dh
                mov al, dh 
                mov dh, 160 
                mul dh 
                mov bx, ax 
                mov al, dl 
                mov dl, 2
                mul dl 
                add bx, ax 
                mov ah, cl 
                mov cl, 0
show :  mov al, [si]
                mov es:[bx], ax 
                mov ch, [si] 
                inc si 
                add bx, 2
                
                jcxz ok 
                                
                jmp show 
ok :        ret

code ends 
end start 


(2)
assume cs: code 

data segment 

        db 10 dup (0)
        
data ends 

code segment 

start : mov ax, 12666
                mov bx, data 
                mov ds, bx 
                mov si, 0
                call dtoc
                
                mov dh, 8
                mov dl, 3
                mov cl, 2
                call show_str 
                
                mov ax, 4c00H
                int 21H
                
dtoc :  push ax  
                push bx 
                push cx 
                push dx 
                push si 
                push di
                        
                mov di, 0
d10 :   mov dx, 0
                mov bx, 10
                div bx  
                
                add dx, 30H
                push dx 
                inc di
                mov cx, ax
                jcxz d11
                
                jmp d10 
                
d11:         mov cx, di
d12:         pop dx  
                mov [si], dl 
                inc si 
                
                loop d12
                
                mov dl, 0
                mov [si], dl 
                
                
                
                        
okay:         pop ax 
                pop bx   
                pop cx 
                pop dx 
                pop si 
                pop di 
                
                ret 
                        
show_str:mov bx, 0
                mov ax, 0b800H
                mov es, ax 
                dec dh
                mov al, dh 
                mov dh, 160 
                mul dh 
                mov bx, ax 
                mov al, dl 
                mov dl, 2
                mul dl 
                add bx, ax 
                mov ah, cl 
                mov cl, 0
show :  mov al, [si]
                mov es:[bx], ax 
                mov ch, [si] 
                inc si 
                add bx, 2
                
                jcxz ok 
                                
                jmp show 
ok :        ret

code ends 
end start 


这两个代码就是因为进入栈的顺序不一样就能导致得到不同的结果,前者能够显示想要的结果,而后者却是乱码,这是为什么呢?(用的masm5.0编译)
最佳答案
2017-9-19 11:51:17
若余相思 发表于 2017-9-19 10:57
第二个程序并没有将bx的值赋给si啊

你还是没说清楚为什么pop的顺序不一样,得到的结果就不一样

捕获.JPG
假设ax,bx,cx,dx,si,di分别是1,2,3,4,5,6,按照你第二个顺序取出来ax,bx,cx,dx,si,di的值就变成了6,5,4,3,2,1
从栈顶一个一个存放进去,然后从存放的最后一个数的地址反向取出。虽然你没直接mov si, bx,但是你pop si的值就是push bx进去的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-9-19 10:39:03 | 显示全部楼层
先说一下FILO:first in last out,先进后出,要是先进的直接pop给先进的寄存器,那你寄存器得到的数据就和一开始你想要的不一样了。
再来看你的程序,虽然你pop出来的几个寄存器的值在显示代码段感觉用不上都是要被重新定义的,但是你忽略了一个si,你在显示代码段里没重新赋值0,所以一直用start代码段里的si,第二个程序你的si已经填入了bx的值,就不会是0了。所以得到的[si]是什么谁知道那。再来说你第一个程序,你的pop也出错了,先pop di,再pop si。
如果还有不明白的点“回复”追问哦。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-9-19 10:57:04 | 显示全部楼层
丶忘却的年少o 发表于 2017-9-19 10:39
先说一下FILO:first in last out,先进后出,要是先进的直接pop给先进的寄存器,那你寄存器得到的数据就和 ...

第二个程序并没有将bx的值赋给si啊

你还是没说清楚为什么pop的顺序不一样,得到的结果就不一样
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-9-19 11:51:17 | 显示全部楼层    本楼为最佳答案   
若余相思 发表于 2017-9-19 10:57
第二个程序并没有将bx的值赋给si啊

你还是没说清楚为什么pop的顺序不一样,得到的结果就不一样

捕获.JPG
假设ax,bx,cx,dx,si,di分别是1,2,3,4,5,6,按照你第二个顺序取出来ax,bx,cx,dx,si,di的值就变成了6,5,4,3,2,1
从栈顶一个一个存放进去,然后从存放的最后一个数的地址反向取出。虽然你没直接mov si, bx,但是你pop si的值就是push bx进去的值。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-6 08:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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