鱼C论坛

 找回密码
 立即注册
查看: 2805|回复: 11

王爽检测点10.5 里的AX值为什么等于3?求高手详细解答。

[复制链接]
发表于 2012-8-3 19:23:15 | 显示全部楼层 |阅读模式
1鱼币
assume cs:code
stack segment                                                
dw 8 dup (0)                              
stack ends                                         
code segment                                            
start:   mov ax,stack                                 
     mov ss,ax                                 
     mov sp,16     
     mov ds,ax
     mov ax,0
     call word ptr ds:[0eh]
     inc ax
     inc ax
     inc ax
     mov ax,4c00h
     int 21h
code ends
end start
u指令查看是
0C50:0000 B84F0C        MOV     AX,0C4F
0C50:0003 8ED0          MOV     SS,AX
0C50:0005 BC1000        MOV     SP,0010
0C50:0008 8ED8          MOV     DS,AX
0C50:000A B80000        MOV     AX,0000
0C50:000D FF160E00      CALL    [000E]
0C50:0011 40            INC     AX
0C50:0012 40            INC     AX
0C50:0013 40            INC     AX
0C50:0014 B8004C        MOV     AX,4C00
0C50:0017 CD21          INT     21

最佳答案

查看完整内容

你仔细看下mov ds,ax这条指令 ,说明DS和SS在同一段内,然后向下执行到 cll word ptr ds:[0eh] 这条指令执行后IP=11 然后SP=0E(因为是 IP入栈了,本来SP在10H或者16现在指向0E) 也就是说0EH的值也就是SP的所指向的值就是0011也就是下一条指令所指向的IP值也就是inc ax这条指令 意思就是相当于cll word ptr ds:[0eh] 这条指令相当于没执行,然后INC 3次 AX在程序返回之前AX=3 不知道这样说你懂了没有,如果没懂可以给我留言{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-3 19:23:16 | 显示全部楼层
你仔细看下mov ds,ax这条指令 ,说明DS和SS在同一段内,然后向下执行到
cll word ptr ds:[0eh] 这条指令执行后IP=11 然后SP=0E(因为是 IP入栈了,本来SP在10H或者16现在指向0E)
也就是说0EH的值也就是SP的所指向的值就是0011也就是下一条指令所指向的IP值也就是inc ax这条指令
意思就是相当于cll word ptr ds:[0eh] 这条指令相当于没执行,然后INC 3次 AX在程序返回之前AX=3
不知道这样说你懂了没有,如果没懂可以给我留言{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-3 19:51:30 | 显示全部楼层
本帖最后由 了缺(sg) 于 2012-8-3 19:53 编辑

刚好我也刚看过这篇
call word ptr 内存单元
相当于 push ip
           jmp word ptr 内存单元
call word ptr ds:[0eh]
就是 push ip,这时ip指向inc ax
把ip压栈
然后执行
jmp word ds:[0e]
ds:[0e]中的值还是ip的值
所以ip还是指向inc ax
然后执行三次 inc ax
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-3 21:20:16 | 显示全部楼层
你说的我还不不明白。我的想法是当ax执行3次是不是从mov ax,0处开始执行,然后跳转到inc ax出执行3次就变成3了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-3 21:59:07 | 显示全部楼层

push ip 后,jmp word ptr 【000e】 从这里条到了DS:000E,但下面是不会运行inc ax,inc ax ,inc ,ax!2楼用debug试试!
call   [000e]
pop si  
mov sp,bp
pop bp
ret
用debug ,ax 都是0000
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-3 22:35:58 | 显示全部楼层
 
assume cs:code 
stack segment                                                
dw 8 dup (0)                               
stack ends                                         
code segment                                            
start:   mov ax,stack                                 
     mov ss,ax                                 
     mov sp,16     
     mov ds,ax
     mov ax,0
     call word ptr ds:[0eh]  ;这条代码等于没用!删掉都可以!
     inc ax
     inc ax
     inc ax
     mov ax,4c00h
     int 21h
code ends
end start
之所有要用这条代码是要理解CALL 指令的功能用法!
先PUSH IP    再JMP   你搞懂这两个指令了就知道问题所在了!

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

使用道具 举报

发表于 2012-8-3 22:52:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-5 15:45:46 | 显示全部楼层
呵呵,看看我的帖子把,最简单的解法,http://bbs.fishc.com/thread-19409-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-5 17:49:35 | 显示全部楼层
这题根本就不能用DEBUG,否则和实际答案不匹配。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-5 18:19:34 | 显示全部楼层
Uchiha 很感谢你的讲解,我明白了,你讲的非常不错,我给你满分:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-6 08:29:01 | 显示全部楼层
谢谢谢谢:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-9 23:34:54 | 显示全部楼层
丶Haw 发表于 2012-8-3 21:59
push ip 后,jmp word ptr 【000e】 从这里条到了DS:000E,但下面是不会运行inc ax,inc ax ,inc ,ax!2楼 ...

用DEBUG调试,设置栈之后会把原来的000给替换成一些未知的值
继续运行之后,会改变原本的汇编代码。请看清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-11-20 13:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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