鱼C论坛

 找回密码
 立即注册
查看: 1801|回复: 6

[已解决]新手问题请大神指点.

[复制链接]
发表于 2018-7-23 12:14:19 | 显示全部楼层 |阅读模式

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

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

x
请问这里的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:[bx]
      add  bx,2
      loop s
      mov bx,0
      mov cx,8
   s0:pop cs:[bx]
      add bx,2
      loop s0
      

mov ax,4c00h
int 21h


codesg ends
end start
最佳答案
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的区别呢,哪一部分是哪取决于你,对于代码而言,你就是上帝,不过,上帝也不一定就能造出活人来。同样道理,由你来告诉机器数据多大,数据在哪,如何使用,如果说错了,代码执行不起来或者崩溃,就这么简单。加油吧,汇编很考验编程思维的,也很锻炼……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-23 12:39:04 | 显示全部楼层
本帖最后由 TyCk 于 2018-7-23 13:06 编辑

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

代码或有问题,assume只是个假设关联,如果想用地址的话,可以用cs吗?是不是应该用 codesg.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 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的空栈是不是和数据栈是同一个段?

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

使用道具 举报

发表于 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.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-7-24 02:53:28 | 显示全部楼层
TyCk 发表于 2018-7-23 13:17
这是两段数据,不能称为数据栈吧?
偏移地址不是30,你自己数数,dw声明字型空间,0也是占两个字节, ...

谢谢你我明白了好多,但是这里是两段数据为什么mov ax,cs mov ss,ax ?用第一段数据段的段地址做栈面。 两个数据段是同在一个地方?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-24 08:27:29 | 显示全部楼层
这问题没必要问吧?自己用DEBUG调试下都能知道的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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的区别呢,哪一部分是哪取决于你,对于代码而言,你就是上帝,不过,上帝也不一定就能造出活人来。同样道理,由你来告诉机器数据多大,数据在哪,如何使用,如果说错了,代码执行不起来或者崩溃,就这么简单。加油吧,汇编很考验编程思维的,也很锻炼……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 09:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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