xiawiner 发表于 2015-12-2 18:51:47

被汇编语言的监测点6.1难住了,求高人赐教,感激不尽。

求解答啊。。

1042746391 发表于 2015-12-2 19:59:19

push
pop cs:

意思是
先把偏移DS段bx大小位置的16位数压入栈。
然后把栈顶的16位数出栈到 偏移cs段的bx大小位置上去。

也就是借栈来从DS段传一个数到CS段的某个位置上。



这也是我百度的

1042746391 发表于 2015-12-2 19:59:58

我最想问的一点是,上面那个36是怎么算出来的呢

zph888 发表于 2015-12-3 13:06:51

16进制24H,就是十进制36

爱你没错 发表于 2015-12-3 16:31:47

1042746391 发表于 2015-12-2 19:59
我最想问的一点是,上面那个36是怎么算出来的呢

dw 0123H,0456H,0789H,0bacH,0defH,0fedH,0cbaH,0987H
dw 0,0,0,0,0,0,0,0,0,0
这里定义了18个字的数据内存空间 18个字*2就是36个字节,所以这36个字节的内存编号应该是0-35,而栈刚开始默认是空的要指向栈底的下一个字节的内存地址,所以就是36了,希望我的解释能让您理解

爱你没错 发表于 2015-12-3 16:34:25

push是压栈,可以把寄存器的值或者某个内存地址的数据压到栈空间里面,当用运算符时CPU会默认从DS寄存器中取数据内存地址的段地址,所以DS可以忽略不写

xiawiner 发表于 2015-12-4 13:48:39

爱你没错 发表于 2015-12-3 16:34
push是压栈,可以把寄存器的值或者某个内存地址的数据压到栈空间里面,当用运算符时CPU会默认从DS寄存器中取 ...

真的很感谢,之前不在,大神回复了我都忘记来感谢了,不好意思。谢谢。

Especially涵 发表于 2015-12-5 14:43:17

1042746391 发表于 2015-12-2 19:59
push
pop cs:



请问第二个或pop ss:这句话什么情况 这不是栈顶的位置 吗?

yundi 发表于 2015-12-6 07:52:38

本帖最后由 yundi 于 2015-12-6 10:42 编辑

这题我也没看明白,先写下自己的分析,再来试验:

push 此时dx=0,就是把0:0~0:15数据入栈。栈段ss=cs,空栈时sp指在10个0后一地址。

pop cs: 一开始cs:指向dw 0123h位置,bx改变时,依次指向后面的数据0456h,0789h...

两句联起来是,依次获取0:0~0:15的数据,入栈一个,弹出一个,将第一排的dw数据依次改变.栈中始终不超过一个数据.

试验过程:
1.d 0:0 10h 先看一下内存中0:0~0:15的数据
2.r 看一下寄存器当前
3.d cs:0 2Fh 根据2看一下程序内存数据,
4.t 执行到push pop时再看1,3两步.
结果:和自己分析相近,但有2个问题:1,push后,没看到栈中的数据,2,程序运行期间0:0~0:15的值为什么会变?谁改了它?

dps521 发表于 2015-12-6 16:11:25

过来可看看呵呵

ufo9876 发表于 2016-1-3 16:19:44

本帖最后由 ufo9876 于 2016-1-3 16:35 编辑

assume cs:code
    code segment
      dw 0123h,,,,,,,,,,,,,,0987h(这里的单位是dw所以定义了16个字节)
      dw 0,0,0,0,0,0,0,0,0,0(这里单位一样但定义了10个0也就是20个字节)
bx的值是从上面的dw后第一位开始计算的,两个dw在CPU来看是连续的,所以加起来是36个字节(16进制的24个字节),sp的指针被定义在最后一个零的位置了,
页: [1]
查看完整版本: 被汇编语言的监测点6.1难住了,求高人赐教,感激不尽。