EzioA 发表于 2015-12-18 16:33:49

程序6.4遇到的一点问题

如题,在使用多个段时,运行发现,开始CS是076C,然后mov ax,stack   之后ax被赋值076B,再然后mov ss,ax,执行后,d076C: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里面被分配了地址吗?

爱你没错 发表于 2015-12-18 16:43:49

开始的的寄存器的值都是系统为DEBUG程序分配的值,即你不在debug程序上运行程序的值,如果你用了debug xxxx 那么debug就会向系统为你的xxxx申请内存空间了.所以运行了mov ax data 后寄存器的值就会根据你的程序加载的情况而随之变化了.因为DOS是一个单任务操作系统

EzioA 发表于 2015-12-18 17:49:52

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

为什么程序在debug中运行代码时前面几行是正确的,到后面,内存里面的数据就自己改变了呢??我没有对内存进行操作。

爱你没错 发表于 2015-12-18 18:12:50

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

你把程序贴出来

EzioA 发表于 2015-12-18 18:17:47

爱你没错 发表于 2015-12-18 18:12
你把程序贴出来

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
                add bx,2
                loop s
               
                mov bx,0
               
                mov cx,8
        s0:        pop
                add bx,2
                loop s0
               
                mov ax,4c00H
                int 21H

code ends
end start

人造人 发表于 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
                add bx,2
                loop s
               
                mov bx,0
               
                mov cx,8
      s0:      pop
                add bx,2
                loop s0
               
                mov ax,4c00H
                int 21H

code ends
end start
问题就在
mov sp,20H
该成
mov sp, 10h
也行
mov sp, 30h
也行
不清楚为什么20h就不行
如果你知道请告诉我,谢谢

EzioA 发表于 2015-12-18 21:16:44

人造人 发表于 2015-12-18 20:47
问题决绝了吗? 我发现问题了,

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


书上的实验代码就是20H。。。什么情况嘛/。

人造人 发表于 2015-12-18 21:18:03

EzioA 发表于 2015-12-18 21:16
书上的实验代码就是20H。。。什么情况嘛/。

你该成30h试试

EzioA 发表于 2015-12-18 22:04:05

改成30H多了几行代码正常了,但之后的代码又出问题了。还得改大一点??

人造人 发表于 2015-12-18 22:53:51

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

贴上代码来

EzioA 发表于 2015-12-19 12:38:57

人造人 发表于 2015-12-18 22: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,30H
               
                mov ax,data
                mov ds,ax
               
                mov bx,0
               
                mov cx,8
        s:        push
                add bx,2
                loop s
               
                mov bx,0
               
                mov cx,8
        s0:        pop
                add bx,2
                loop s0
               
                mov ax,4c00H
                int 21H

code ends
end start

tianyuan 发表于 2015-12-19 17:14:03

本帖最后由 tianyuan 于 2015-12-19 17:15 编辑

嘿,这位朋友,你编译, 链接(Link)最后面的提示,看看是不是提示没有 堆栈段。

爱你没错 发表于 2015-12-19 17:36:14

EzioA 发表于 2015-12-19 12:38
assume cs:code,ds:data,ss:stack

data segment


要改成10H哦,你定义的栈段只有16个字节啊!你却把栈底写成了20H这明想就是堆栈溢出了啊!

爱你没错 发表于 2015-12-19 17:40:51

人造人 发表于 2015-12-18 20:47
问题决绝了吗? 我发现问题了,

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


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

EzioA 发表于 2015-12-19 18:10:44

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

完美!!


我还有一个问题,dw 0,0,0,0,0,0,0,0 这行代码没有给栈内部空间造成影响啊,栈内部空间数据不是0,那这句话有啥用???

爱你没错 发表于 2015-12-19 20:25:23

EzioA 发表于 2015-12-19 18:10
完美!!




dw 0,0,0,0,0,0,0,0 的意思是分配8个字的空间做栈段,并且用0填充初始化.当然你也可以改成dw 1,1,1,1,1,1,1,1但是这样不觉得很别扭吗?

EzioA 发表于 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初始化-=-

爱你没错 发表于 2015-12-22 10:08:21

EzioA 发表于 2015-12-21 23:04
debug过程里面栈内数据没有被0初始化-=-

这个就要请教小甲鱼老师了

聆云 发表于 2016-2-20 22:39:34

有初始化,你定义的栈,不只是你自己再用,loop指令也在用,loop要把标号处的cs,ss ,ip,等数据入栈保存 ,才会在循环的时候取到标号的地址,而在debug 中,用t单步执行时,loop标号用的栈默认就是你定义的栈,所以你还没push呢,栈中就已经有了数据
页: [1]
查看完整版本: 程序6.4遇到的一点问题