鱼C论坛

 找回密码
 立即注册
查看: 3194|回复: 18

[已解决]程序6.4遇到的一点问题

[复制链接]
发表于 2015-12-18 16:33:49 | 显示全部楼层 |阅读模式

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

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

x
如题,在使用多个段时,运行发现,开始CS是076C,然后mov ax,stack     之后ax被赋值076B,再然后mov ss,ax,执行后,d  076C:0,发现后面的数据被修改了。为什么会发生自动修改???还有,stack的地址为什么会被分配在PSP内部啊。。。





出现这个问题,我后面调试做不下去了。我有个问题,在assume cs:code, ds:data, ss:stack时,CPU为什么只是给标号data,stack分配地址而没有为ds,ss分配地址???如果只给标号分配地址,那么dw   后面的数据究竟存在哪里???


为什么ds,ss都需要在代码中用mov 指令来写入,但是cs不需要?cs和ss,ds不一样吗??cs是在assume里面被分配了地址吗?

QQ截图20151218162528.png QQ截图20151218162557.png
最佳答案
2015-12-19 17:40:51
人造人 发表于 2015-12-18 20:47
问题决绝了吗? 我发现问题了,

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

你定义的栈段有多长栈顶指针最多就是只能指向栈底和栈顶,如果超过了就会发生堆栈越界,这个在使用栈的时候一定要小心,因为栈指针一越界就会访问到不属于你的程序的数据,很容易造成系统的各种问题.当然如果你知道你要溢出的数据是属于什么程序而你又通过正常途径又无法取得这个程序的数据,那么使用这种方法就是所谓的溢出攻击了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2015-12-18 16:43:49 | 显示全部楼层
开始的的寄存器的值都是系统为DEBUG程序分配的值,即你不在debug程序上运行程序的值,如果你用了debug xxxx 那么debug就会向系统为你的xxxx申请内存空间了.所以运行了mov ax data 后寄存器的值就会根据你的程序加载的情况而随之变化了.因为DOS是一个单任务操作系统
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-18 17:49:52 | 显示全部楼层
爱你没错 发表于 2015-12-18 16:43
开始的的寄存器的值都是系统为DEBUG程序分配的值,即你不在debug程序上运行程序的值,如果你用了debug xxxx  ...

为什么程序在debug中运行代码时前面几行是正确的,到后面,内存里面的数据就自己改变了呢??我没有对内存进行操作。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-18 18:12:50 | 显示全部楼层
EzioA 发表于 2015-12-18 17:49
为什么程序在debug中运行代码时前面几行是正确的,到后面,内存里面的数据就自己改变了呢??我没有对内 ...

你把程序贴出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-18 18:17:47 | 显示全部楼层

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

data segment
                dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
data ends

stack segment
                dw 0,0,0,0,0,0,0,0
stack ends


code segment
start:        mov ax,stack
                mov ss,ax
                mov sp,20H
               
                mov ax,data
                mov ds,ax
               
                mov bx,0
               
                mov cx,8
        s:        push [bx]
                add bx,2
                loop s
               
                mov bx,0
               
                mov cx,8
        s0:        pop [bx]
                add bx,2
                loop s0
               
                mov ax,4c00H
                int 21H

code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-18 20:47:53 | 显示全部楼层
问题决绝了吗? 我发现问题了,

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

data segment
                dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
data ends

stack segment
                dw 0,0,0,0,0,0,0,0
stack ends


code segment
start:        mov ax,stack
                mov ss,ax
                mov sp,20H
               
                mov ax,data
                mov ds,ax
               
                mov bx,0
               
                mov cx,8
        s:        push [bx]
                add bx,2
                loop s
               
                mov bx,0
               
                mov cx,8
        s0:        pop [bx]
                add bx,2
                loop s0
               
                mov ax,4c00H
                int 21H

code ends
end start
问题就在
mov sp,20H
该成
mov sp, 10h
也行
mov sp, 30h
也行
不清楚为什么20h就不行
如果你知道请告诉我,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-18 21:16:44 | 显示全部楼层
人造人 发表于 2015-12-18 20:47
问题决绝了吗? 我发现问题了,

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

书上的实验代码就是20H。。。什么情况嘛/。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-18 21:18:03 | 显示全部楼层
EzioA 发表于 2015-12-18 21:16
书上的实验代码就是20H。。。什么情况嘛/。

你该成30h试试
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-18 22:04:05 | 显示全部楼层
改成30H多了几行代码正常了,但之后的代码又出问题了。还得改大一点??
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-18 22:53:51 | 显示全部楼层
EzioA 发表于 2015-12-18 22:04
改成30H多了几行代码正常了,但之后的代码又出问题了。还得改大一点??

贴上代码来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-19 12:38:57 | 显示全部楼层

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

data segment
                dw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987H
data ends

stack segment
                dw 0,0,0,0,0,0,0,0
stack ends


code segment
start:        mov ax,stack
                mov ss,ax
                mov sp,30H
               
                mov ax,data
                mov ds,ax
               
                mov bx,0
               
                mov cx,8
        s:        push [bx]
                add bx,2
                loop s
               
                mov bx,0
               
                mov cx,8
        s0:        pop [bx]
                add bx,2
                loop s0
               
                mov ax,4c00H
                int 21H

code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-19 17:14:03 | 显示全部楼层
本帖最后由 tianyuan 于 2015-12-19 17:15 编辑

嘿,这位朋友,你编译, 链接(Link)最后面的提示,看看是不是提示没有 堆栈段。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-19 17:36:14 | 显示全部楼层
EzioA 发表于 2015-12-19 12:38
assume cs:code,ds:data,ss:stack

data segment

要改成10H哦,你定义的栈段只有16个字节啊!你却把栈底写成了20H这明想就是堆栈溢出了啊!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-19 17:40:51 | 显示全部楼层    本楼为最佳答案   
人造人 发表于 2015-12-18 20:47
问题决绝了吗? 我发现问题了,

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

你定义的栈段有多长栈顶指针最多就是只能指向栈底和栈顶,如果超过了就会发生堆栈越界,这个在使用栈的时候一定要小心,因为栈指针一越界就会访问到不属于你的程序的数据,很容易造成系统的各种问题.当然如果你知道你要溢出的数据是属于什么程序而你又通过正常途径又无法取得这个程序的数据,那么使用这种方法就是所谓的溢出攻击了.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-19 18:10:44 | 显示全部楼层
爱你没错 发表于 2015-12-19 17:40
你定义的栈段有多长栈顶指针最多就是只能指向栈底和栈顶,如果超过了就会发生堆栈越界,这个在使用栈的时候 ...

完美!!


我还有一个问题,dw 0,0,0,0,0,0,0,0 这行代码没有给栈内部空间造成影响啊,栈内部空间数据不是0,那这句话有啥用???
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-19 20:25:23 | 显示全部楼层

dw 0,0,0,0,0,0,0,0 的意思是分配8个字的空间做栈段,并且用0填充初始化.当然你也可以改成dw 1,1,1,1,1,1,1,1但是这样不觉得很别扭吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2015-12-21 23:04:33 | 显示全部楼层
爱你没错 发表于 2015-12-19 20:25
dw 0,0,0,0,0,0,0,0 的意思是分配8个字的空间做栈段,并且用0填充初始化.当然你也可以改成dw 1,1,1,1,1,1, ...

debug过程里面栈内数据没有被0初始化-=-
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2015-12-22 10:08:21 | 显示全部楼层
EzioA 发表于 2015-12-21 23:04
debug过程里面栈内数据没有被0初始化-=-

这个就要请教小甲鱼老师了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-20 22:39:34 From FishC Mobile | 显示全部楼层
有初始化,你定义的栈,不只是你自己再用,loop指令也在用,loop要把标号处的cs,ss ,ip,等数据入栈保存 ,才会在循环的时候取到标号的地址,而在debug 中,用t单步执行时,loop标号用的栈默认就是你定义的栈,所以你还没push呢,栈中就已经有了数据
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 07:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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