ok206 发表于 2018-7-23 12:14:19

新手问题请大神指点.

请问这里的CS指向的内存地址,是第一个数据栈道DW:的段地址?还是指向了第二个空的栈道DW:的段地址?为什么
assume cs:codesg
codesg segment
dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987h
dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
start:mov ax,cs
      mov ss,ax
      mov sp,30
      mov bx,0
      mov cx,8
    s:push cs:
      addbx,2
      loop s
      mov bx,0
      mov cx,8
   s0:pop cs:
      add bx,2
      loop s0
      

mov ax,4c00h
int 21h


codesg ends
end start

TyCk 发表于 2018-7-23 12:39:04

本帖最后由 TyCk 于 2018-7-23 13:06 编辑

应该是第一个,这里只有一个段,数据也定义在代码段中。
编译,应该是从上到下,之后指令指针IP被设置到start位置。
所以,CS的实际地址应当是第一个dw数据的地址。
可以反汇编看一下,以作确认。

代码或有问题,assume只是个假设关联,如果想用地址的话,可以用cs吗?是不是应该用 codesg.

ok206 发表于 2018-7-23 13:06:24

本帖最后由 ok206 于 2018-7-23 13:07 编辑

TyCk 发表于 2018-7-23 12:39
应该是第一个,这里只有一个段,数据也定义在代码段中。
编译,应该是从上到下,之后指令指针IP被设置到st ...

如果是这样的话 SS的地址就是CS 的地址 (就是第一个数据栈的段地址)SP 就是指向了 这个栈的最后一个偏移地址(两个栈加起来最后那个偏移地址=30?) 那么SS 和SP是怎样识别到 最后那16位空栈 16的空栈是不是和数据栈是同一个段?

TyCk 发表于 2018-7-23 13:17:12

本帖最后由 TyCk 于 2018-7-23 15:13 编辑

ok206 发表于 2018-7-23 13:06
如果是这样的话 SS的地址就是CS 的地址 (就是第一个数据栈的段地址)SP 就是指向了 这个栈的最后一个 ...

这是两段数据,不能称为数据栈吧?
偏移地址不是30,你自己数数,dw声明字型空间,0也是占两个字节,应该是有48个字节吧。(你这声明的太麻烦了,可以用dup,简化一下)
你要明白,程序本身没法智能识别,你把sp指向栈底,它就会依次放入数据;你指错了,就可能堆栈溢出,是个bug。
段本身只是为了方便编程而已,机器不知道,归根到底,就是一堆0和1.

ok206 发表于 2018-7-24 02:53:28

TyCk 发表于 2018-7-23 13:17
这是两段数据,不能称为数据栈吧?
偏移地址不是30,你自己数数,dw声明字型空间,0也是占两个字节, ...

谢谢你我明白了好多,但是这里是两段数据为什么mov ax,cs mov ss,ax ?用第一段数据段的段地址做栈面。 两个数据段是同在一个地方?

57158597@qq.com 发表于 2018-7-24 08:27:29

这问题没必要问吧?自己用DEBUG调试下都能知道的

TyCk 发表于 2018-7-24 17:44:30

本帖最后由 TyCk 于 2018-7-24 18:51 编辑

ok206 发表于 2018-7-24 02:53
谢谢你我明白了好多,但是这里是两段数据为什么mov ax,cs mov ss,ax ?用第一段数据段的段地址做栈面。...

这就一个段,只不过在不同位置。
假设codesg位置是在0x400000吧,
你想问如何区分这两部分数据?
0x400000 + 0开始标识第一部分数据,
0x400016 + 0开始标识第二部分数据。
说白了,不同的数据所在地址不同,调用不同的地址的数据,自然也就区分开了。

就是0和1的区别呢,哪一部分是哪取决于你,对于代码而言,你就是上帝,不过,上帝也不一定就能造出活人来。同样道理,由你来告诉机器数据多大,数据在哪,如何使用,如果说错了,代码执行不起来或者崩溃,就这么简单。加油吧,汇编很考验编程思维的,也很锻炼……{:10_279:}
页: [1]
查看完整版本: 新手问题请大神指点.