. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->寄存器(内存访问)
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  栈,挑下 刺儿  [已解决] 回复[ 10次 ]   点击[ 506次 ]  
xy26333
[帖 主]   [ 发表时间:2010-07-08 23:32 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
问题3.7 编程将10000H--1000FH 这段空间当做栈,初始状态栈空,将AX,BX,DS中的数据入栈..

书上的代码:
mov ax,1000H(不建议用ax中转!)
MOV ss,ax
MOV sp,0010H
push ax
   .
   .
   .

3.09节 中一句原话“push,pop等栈操作指令,修改的只是sp,也就是说,栈顶的变化范围最大为:0-FFFFH”
如果栈 只支持字型数据的传送的话,栈顶的变化范围最大为:0-FFFE或 1-FFFF
13784632020
[第1楼]   [ 回复时间:2010-07-09 05:29 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-07-02 05:46
为什么不建议用AX中转?楼主能不能说下原因,我没觉得有什么问题啊?

   我倒是觉得楼主“如果栈只支持字型数据的传送的话,栈顶的变化范围最大为0--FFFE或1--FFFF”这个说法似乎有问题。栈顶必须要包含在栈空间内吗?

   本人也是初学。。。。。。。。
masmaster
[第2楼]   [ 回复时间:2010-07-09 08:23 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
栈空时,SS:SP栈空间最高地址的下一个单元。 如果10000H~10000FH是一空栈的话, SP=10h,即栈顶不在栈空间内。
abob
[第3楼]   [ 回复时间:2010-07-09 09:28 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
mov sp,0

push ax
--:sp=sp-2=fffeh
push ax
--:sp=sp-2=fffch

这样正好适用了0~ffffH空间当作栈。

mov ax,1000H(不建议用ax中转!) 
-----------
用ax没问题题啊,虽然有把ax叫累加器,但cpu并没有规定ax必须作为累加器适用。这样用没问题。
xy26333
[第4楼]   [ 回复时间:2010-07-09 14:35 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
这个:不建议用ax中转 是因为你并不知道原来ax中数据多少,设原来(ax)=0000H,本来应该将0000H入栈,而你却将1000H,入栈(虽然题中没明确说明,但个人认为还是别用ax中转)

关于第二点,栈顶是一个字单元,书上用  “N地址字单元” 表述一个字单元,就好比我给你一个 偶数2,你只能做+2 -2这两种运算,不限制你运算次数,你能把这个偶数变成奇数么??,故不管栈顶怎么变化,他的变化范围最大只能为0--FFFE(偶数)或1--FFFF(奇数).... 所以个人认为 “栈顶的变化范围最大为:0-FFFFH”这句话说的好像有点不合适....
abob
[第5楼]   [ 回复时间:2010-07-09 15:36 ]   [引用]   [回复]   [ top ] 
荣誉值:169
信誉值:0
注册日期:2008-08-19 16:07
这个:不建议用ax中转 是因为你并不知道原来ax中数据多少,设原来(ax)=0000H,本来应该将0000H入栈,而你却将1000H,入栈(虽然题中没明确说明,但个人认为还是别用ax中转) 
-------------
如果按照个思路分析,没有寄存器可以用来中转,因为后面紧跟着都有可能是这个寄存器入栈。

设原来(ax)=0000H,我们可以在用ax做中转后mov ax,0重新赋值。


他的变化范围最大只能为0--FFFE(偶数)或1--FFFF(奇数)
---------
这个加一起就是0~ffffh了。
13784632020
[第6楼]   [ 回复时间:2010-07-10 11:51 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:2
注册日期:2010-07-02 05:46
这个:不建议用ax中转 是因为你并不知道原来ax中数据多少,设原来(ax)=0000H,本来应该将0000H入栈,而你却将1000H,入栈(虽然题中没明确说明,但个人认为还是别用ax中转)

关于第二点,栈顶是一个字单元,书上用  “N地址字单元” 表述一个字单元,就好比我给你一个 偶数2,你只能做+2 -2这两种运算,不限制你运算次数,你能把这个偶数变成奇数么??,故不管栈顶怎么变化,他的变化范围最大只能为0--FFFE(偶数)或1--FFFF(奇数).... 所以个人认为 “栈顶的变化范围最大为:0-FFFFH”这句话说的好像有点不合适....
------------------

回复:不是吧。
    1.mov ax,1000H是给AX重新赋值了,与原来是多少有什么关系?又不是add ax,1000H?
    2.栈顶是个字单元?在哪一页啊,我看看。我倒觉得栈顶只是个临界值。
masmaster
[第7楼]   [ 回复时间:2010-07-10 15:23 ]   [引用]   [回复]   [ top ] 
荣誉值:268
信誉值:12
注册日期:2010-06-18 22:19
因为没有直接给段寄存器直接赋值的指令,所以必须用一个寄存器中专一下,书里的只是个例子~ 当然, 也可以用别的寄存器,如bx等。
xy26333
[第8楼]   [ 回复时间:2010-07-10 19:22 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
回复:[第5楼]
------------------
这个 不能加,要是奇数就都是奇数,栈顶不能既奇既偶...两者是2选1的关系,不能简单相加
bigbigwolf
[第9楼]   [ 回复时间:2010-07-19 09:59 ]   [引用]   [回复]   [ top ] 
荣誉值:2
信誉值:0
注册日期:2010-01-13 10:56
回复:[第5楼]
------------------
这个 不能加,要是奇数就都是奇数,栈顶不能既奇既偶...两者是2选1的关系,不能简单相加
------------------
回复:“栈顶的变化范围最大为:0-FFFFH”这个没问题吧。五楼所写的“+”是逻辑意义上的。

一个公司有2个人,一个人能从0写到5,一个人能从6写到10。那么公司经理就可以说:我公司能写出的数是0~10。至于具体谁写,栈顶的变化是1 3 5 还是 0 2 4都是栈顶的变化范围。
xy26333
[第10楼]   [ 回复时间:2010-10-10 13:48 ]   [引用]   [回复]   [ top ] 
荣誉值:16
信誉值:16
注册日期:2010-04-02 01:09
此贴由 贴主 于 [ 2010-10-10 13:48 ] 结贴。 结贴原因:问题已解决
得分情况:
此问题已结贴!
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved