鱼C论坛

 找回密码
 立即注册
查看: 2186|回复: 10

关于栈的几个问题,进阶的

[复制链接]
发表于 2014-8-25 09:44:36 | 显示全部楼层 |阅读模式
80鱼币
1:一个程序能定义几个栈段?  
2:定义栈的时候如题:默认几经关联SS了
scoke segment
     dw 0,0,0,0,0
scoke ends
这里换成DD,或db能不能?等下POP,PUSH的时候能运行不,结果是报错还是?
3: 不是说ES是空闲的段寄存器吗?能不能用 ES来代替SS,
4:BP我记得是默认SS的,但是我看别的代码 比如 mov ax,ds:[bx+bp],  这里面的 BP是什么?只向的是哪里?是一个地址吗?我说不清楚,帮我解释下……~~
5:
scoke segment
     dw 0,0,0,0,0
      dw 1,1,1,1,1,
scoke ends  

如果我没定义 dw 1,1,1,1,1, 这一行的话,是定义了5个0,这时候如果假如是一个完整的程序,没其他段什么的,我要查看我定义的这5个0是用DEBUG是D 0:0 吗, 0不容易看,就用 DEBUG看我定义的5个1号了 要去哪里看呢,  。。。。。。。。。。。


6:能不能像我 这样子定义?
scoke segment
     dw 0,0,0,0,0
      dw 1,1,1,1,1,
      dw 12,12,12
scoke ends

我这样子是不是 相当于 初始化栈了?指定了栈里面要存放 的数据/?这是对的还是错的

7:LOOP  这种 循环命令的 手脚能不能 伸到 栈段里面?就是把标号 放在 栈段里的任何一行数据旁边

8:LOOP 指令,    我看人家的代码一次写好几个CX,我怎么才能知道那个和那个配对呢?  比如C语言的循环就近配对原则,这个汇编LOOP循环是什么原则。、?
其他没什么问题了,问别人说这个自己实验好,可我就算自己实验了也就是闭门造车的结果。还是提问好了,:handshake,鱼BI 多,送给帮我解答的人

最佳答案

查看完整内容

1 我不知道 2 首先我改正一下,如果你只是定义这么一个数据段,在代码中没有把SS和Stack关联,你push时候并没有push进stack中。如果是定义成db时没有错,而且push进去。 3 不能用ES代替SS,因为你push的时候是把数据push进 SS:SP地址中。如果你用SS替换成ES,那你怎么使用push,pop命令
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-25 09:44:37 | 显示全部楼层
1 我不知道
2 首先我改正一下,如果你只是定义这么一个数据段,在代码中没有把SS和Stack关联,你push时候并没有push进stack中。如果是定义成db时没有错,而且push进去。
3 不能用ES代替SS,因为你push的时候是把数据push进 SS:SP地址中。如果你用SS替换成ES,那你怎么使用push,pop命令

评分

参与人数 1鱼币 +5 收起 理由
拈花小仙 + 5 热爱鱼C^_^

查看全部评分

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

使用道具 举报

发表于 2014-8-25 12:36:25 | 显示全部楼层
本帖最后由 流行语 于 2014-8-25 12:38 编辑

4 BP默认的段地址是SS,mov ax,ds:[bx+bp]这行代码的意思是 ax = ((ds)*16+bx+bp)。取出等号右边的值赋值给ax寄存器。
5 你用Debug看啊,如果把这段数据和DS关联,DS中就会存储这段数据的地址,你可以通过 -d DS:0 (DS是指ds中存储的值)这样就可以查看这段数据中值的变化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-25 14:13:44 | 显示全部楼层
1. 完全可以定义多个栈段。
2. dd dw db都是数据定义类型, 只是用来开辟栈的空间大小的,不存在报错滴。
3. 不能,但是ES可以寄存数据,可以做DS使用。
4. BP是基地址寄存器,一般情况下BP存放一个基地址,在你这里通过bx的偏移来取得数据实际存放的地址。一般函数调用的BP用来保存函数进入时的sp栈顶基址。
5. 那得看你这个数据是在哪个段了,如果保存在DS段,当你执行完mov ax,scoke ;mov ds,ax 后,在debug下 -d ds:0 就可以看到了DS段内容了。
6. 你这只是开辟了一段内存空间而已,初始化栈要做的是给ss指定你开辟内存空间的位置,接着还要给sp指定大小。
7. 循环标号位置到底能不能放到代码段之外,这个你真的可以动手操作一下。不过放到代码段之外有何意义呢。
8. 就近原则,注意循环嵌套时保护cx。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-25 15:33:22 | 显示全部楼层
小靚同学Leon 发表于 2014-8-25 14:13
1. 完全可以定义多个栈段。
2. dd dw db都是数据定义类型, 只是用来开辟栈的空间大小的,不存在报错滴。
...

1:一个程序能定义几个栈段,假设
assume cs:code ,  ss:stack, ss:strck

stcak segment
     DW  0,0,0,0
stack ends

strck segment
    DB  0,0,0,0
strck ends

mov ax,0d8h
push ax
这样子我感觉明显错误啊,这是push哪里去了,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-25 15:38:45 | 显示全部楼层
小靚同学Leon 发表于 2014-8-25 14:13
1. 完全可以定义多个栈段。
2. dd dw db都是数据定义类型, 只是用来开辟栈的空间大小的,不存在报错滴。
...

2:  那开辟出来的 栈空间假如是 字节型的。栈都是以字来存储的呀,push ax 的时候会是什么情况、看起来像要溢出的样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-25 15:42:02 | 显示全部楼层
流行语 发表于 2014-8-25 12:33
1 我不知道
2 首先我改正一下,如果你只是定义这么一个数据段,在代码中没有把SS和Stack关联,你push时候 ...

2:  关联了 push进去后CPU和存储是怎么处理这些数据的、?    我们开辟的是以字节为单位的栈空间,可是栈都是以字来存储单位的, 溢出?还是直接报错了:funk:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2014-8-25 15:49:38 | 显示全部楼层
流行语 发表于 2014-8-25 12:36
4 BP默认的段地址是SS,mov ax,ds:这行代码的意思是 ax = ((ds)*16+bx+bp)。取出等号右边的值赋值给ax寄存 ...

4:我 简易的理解 BP和BX都是一个偏移地址,但是这2个偏移地址能想家组成一个新的偏移地址,是么。?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-25 17:25:58 | 显示全部楼层
Ъγ:_小ツ雨oο 发表于 2014-8-25 15:33
1:一个程序能定义几个栈段,假设
assume cs:code ,  ss:stack, ss:strck

你还是没有懂4#说的,你只是定义了数据段,并没有和SS寄存器关联起来,你这样只会push到系统给你分配的栈空间中。并没有push到你自己的数据段中。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-25 17:29:31 | 显示全部楼层
Ъγ:_小ツ雨oο 发表于 2014-8-25 15:38
2:  那开辟出来的 栈空间假如是 字节型的。栈都是以字来存储的呀,push ax 的时候会是什么情况、看起来 ...

虽然压栈或者是弹出都是字型的,如果你申请的空间是字节型的,那么你压栈时会占用两个字节。我感觉你试一下最好了,这样自己可以加深影响,而且可以检验自己想的是否正确。纸上得来终觉浅,绝知此事要躬行。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-25 17:33:35 | 显示全部楼层
Ъγ:_小ツ雨oο 发表于 2014-8-25 15:49
4:我 简易的理解 BP和BX都是一个偏移地址,但是这2个偏移地址能想家组成一个新的偏移地址,是么。?

bp和bx不能组合偏移地址,你看一下王爽汇编第8章8.1中详细讲解。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-18 10:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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