KK学脚本 发表于 2012-3-5 17:37:52

检测点10.4

程序执行后,ax的值是多少?
内存地址               机器码                      汇编指令
1000:0                b8 06 00               mov ax,6
1000:2                  ff   d0                   call ax
1000 :5                  40                        inc ax
1000 :6                                                mov bp,sp
                                                               add ax,


怎么知道SP的值???





http://bbs.fishc.com/xwb/images/bgimg/icon_logo.png 该贴已经同步到 KK学脚本的微博

莫名其妙 发表于 2012-3-5 19:41:35

本帖最后由 莫名其妙 于 2012-3-5 19:54 编辑

这里你不需要知道sp具体是多少 !    为什么
这里不是让你计算sp 的 是为了让你知道 call 指令 执行的意思是什么


内存地址               机器码                      汇编指令
1000:0                b8 06 00               mov ax,6 ; ax=6,ip指向1000:3
1000:3                  ff   d0                   call ax    ;pushipjmp 16位寄存器为ip的地方   ip指向1000:6 因为是call 16位寄存器 此时内保

                                                                                 存的是下一条指令的ip地址也就 是push进去的是0005

1000:5                  40                        inc ax;这条指令暂时跳过

1000 :6                                                mov bp,sp;跳到这里执行这里不管sp是多少 因为用不上 看下面



                                                               add ax,   ;这里 ds: +ax   ds: 内保存的是什么 ?
因为bp等与sp所以 sp指向的内存单元内保存的是什么?
保存的是刚才call 命令时push进来的 下一段代码的地址 也就是ip=0005      
所以 这里 调用的跟sp的大小没关          这里只是调用sp指向内存单元的数据 0005

cqy55555 发表于 2012-3-5 19:49:53


KK学脚本 发表于 2012-3-9 18:09:52

:D:D:D懂了

meiyoudao 发表于 2012-7-14 17:27:47

莫名其妙 发表于 2012-3-5 19:41 static/image/common/back.gif
这里你不需要知道sp具体是多少 !    为什么
这里不是让你计算sp 的 是为了让你知道 call 指令 执行的意思是 ...

高手. 一语惊醒梦中人

爱人等于爱自 发表于 2012-7-16 12:14:00

莫名其妙 发表于 2012-3-5 19:41 static/image/common/back.gif
这里你不需要知道sp具体是多少 !    为什么
这里不是让你计算sp 的 是为了让你知道 call 指令 执行的意思是 ...

你写错了吧 兄弟【bp】默认的段地址是SS 不是DS 是栈段 而不是数据段的 而你写的是ds:纯属误导人啊 我说我看了半天 都不理解

敉沧 发表于 2012-7-16 12:53:33

爱人等于爱自 发表于 2012-7-16 12:14
你写错了吧 兄弟【bp】默认的段地址是SS 不是DS 是栈段 而不是数据段的 而你写的是ds:纯属误导人啊 我说我 ...

哥,你自己都说了。。bp默认是ss为段地址。那么,加了段前缀,ds:,是强制使bp的段地址为ds。

爱人等于爱自 发表于 2012-7-18 10:44:59

敉沧 发表于 2012-7-16 12:53 static/image/common/back.gif
哥,你自己都说了。。bp默认是ss为段地址。那么,加了段前缀,ds:,是强制使bp的段地址为ds。

那有一点我不明白了哦 call ax 执行2步 第一步是将call下一条指令压入栈 那就是将 005压入栈段 而不是数据段,你强制使bp的段地址为DS段 试问DS段和栈段的段地址是一样的吗?也就是说 DS:bp和ss:bp指向的内容都是刚才的偏移地址005吗? 你怎么知道DS:bp存储的内容也是005呢? push命令执行的是压入栈中哦 如果DS和ss指向的地址不是同一个地址的话 那DS:bp指向的位置就是错误的哦 不知道我说的对不对 请赐教!

菜鸟一个a 发表于 2014-1-17 15:49:45

学习学习再学习

远山 发表于 2016-4-25 10:40:29

本帖最后由 远山 于 2016-4-25 10:41 编辑

爱人等于爱自 发表于 2012-7-18 10:44
那有一点我不明白了哦 call ax 执行2步 第一步是将call下一条指令压入栈 那就是将 005压入栈段 而不是数 ...

我觉得你说的对,确实不能用ds段,2楼的前辈应该是笔误写成了ds:sp{:10_277:}

你是空气 发表于 2016-8-30 12:40:14

了解了{:10_254:}
页: [1]
查看完整版本: 检测点10.4