新手问题请大神指点.
请问这里的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 13:06 编辑
应该是第一个,这里只有一个段,数据也定义在代码段中。
编译,应该是从上到下,之后指令指针IP被设置到start位置。
所以,CS的实际地址应当是第一个dw数据的地址。
可以反汇编看一下,以作确认。
代码或有问题,assume只是个假设关联,如果想用地址的话,可以用cs吗?是不是应该用 codesg. 本帖最后由 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 15:13 编辑
ok206 发表于 2018-7-23 13:06
如果是这样的话 SS的地址就是CS 的地址 (就是第一个数据栈的段地址)SP 就是指向了 这个栈的最后一个 ...
这是两段数据,不能称为数据栈吧?
偏移地址不是30,你自己数数,dw声明字型空间,0也是占两个字节,应该是有48个字节吧。(你这声明的太麻烦了,可以用dup,简化一下)
你要明白,程序本身没法智能识别,你把sp指向栈底,它就会依次放入数据;你指错了,就可能堆栈溢出,是个bug。
段本身只是为了方便编程而已,机器不知道,归根到底,就是一堆0和1. TyCk 发表于 2018-7-23 13:17
这是两段数据,不能称为数据栈吧?
偏移地址不是30,你自己数数,dw声明字型空间,0也是占两个字节, ...
谢谢你我明白了好多,但是这里是两段数据为什么mov ax,cs mov ss,ax ?用第一段数据段的段地址做栈面。 两个数据段是同在一个地方? 这问题没必要问吧?自己用DEBUG调试下都能知道的 本帖最后由 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]