八神 发表于 2012-8-3 19:23:15

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

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:   inc ax   inc ax   inc ax   mov ax,4c00h   int 21hcode endsend startu指令查看是0C50:0000 B84F0C      MOV   AX,0C4F0C50:0003 8ED0          MOV   SS,AX0C50:0005 BC1000      MOV   SP,00100C50:0008 8ED8          MOV   DS,AX0C50:000A B80000      MOV   AX,00000C50:000D FF160E00      CALL    0C50:0011 40            INC   AX0C50:0012 40            INC   AX0C50:0013 40            INC   AX0C50:0014 B8004C      MOV   AX,4C000C50:0017 CD21          INT   21

Uchiha 发表于 2012-8-3 19:23:16

你仔细看下mov ds,ax这条指令 ,说明DS和SS在同一段内,然后向下执行到
cll word ptr ds: 这条指令执行后IP=11 然后SP=0E(因为是 IP入栈了,本来SP在10H或者16现在指向0E)
也就是说0EH的值也就是SP的所指向的值就是0011也就是下一条指令所指向的IP值也就是inc ax这条指令
意思就是相当于cll word ptr ds: 这条指令相当于没执行,然后INC 3次 AX在程序返回之前AX=3
不知道这样说你懂了没有,如果没懂可以给我留言{:1_1:}

了缺(sg) 发表于 2012-8-3 19:51:30

本帖最后由 了缺(sg) 于 2012-8-3 19:53 编辑

刚好我也刚看过这篇
call word ptr 内存单元
相当于 push ip
         jmp word ptr 内存单元
call word ptr ds:
就是 push ip,这时ip指向inc ax
把ip压栈
然后执行
jmp word ds:
ds:中的值还是ip的值
所以ip还是指向inc ax
然后执行三次 inc ax

八神 发表于 2012-8-3 21:20:16

你说的我还不不明白。我的想法是当ax执行3次是不是从mov ax,0处开始执行,然后跳转到inc ax出执行3次就变成3了!

丶Haw 发表于 2012-8-3 21:59:07

了缺(sg) 发表于 2012-8-3 19:51 static/image/common/back.gif
刚好我也刚看过这篇
call word ptr 内存单元
相当于 push ip


push ip 后,jmp word ptr 【000e】 从这里条到了DS:000E,但下面是不会运行inc ax,inc ax ,inc ,ax!2楼用debug试试!
call   
pop si
mov sp,bp
pop bp
ret
用debug ,ax 都是0000

天长地久 发表于 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:;这条代码等于没用!删掉都可以!
   inc ax
   inc ax
   inc ax
   mov ax,4c00h
   int 21h
code ends
end start之所有要用这条代码是要理解CALL 指令的功能用法!
先PUSH IP    再JMP   你搞懂这两个指令了就知道问题所在了!

lukelqz 发表于 2012-8-3 22:52:21

http://bbs.fishc.com/thread-20370-1-1.html看看这个帖子呢。

NeBen 发表于 2012-8-5 15:45:46

呵呵,看看我的帖子把,最简单的解法,http://bbs.fishc.com/thread-19409-1-1.html

八神 发表于 2012-8-5 17:49:35

这题根本就不能用DEBUG,否则和实际答案不匹配。

八神 发表于 2012-8-5 18:19:34

Uchiha 很感谢你的讲解,我明白了,你讲的非常不错,我给你满分:lol

Uchiha 发表于 2012-8-6 08:29:01

谢谢谢谢:lol

了缺(sg) 发表于 2012-8-9 23:34:54

丶Haw 发表于 2012-8-3 21:59 static/image/common/back.gif
push ip 后,jmp word ptr 【000e】 从这里条到了DS:000E,但下面是不会运行inc ax,inc ax ,inc ,ax!2楼 ...

用DEBUG调试,设置栈之后会把原来的000给替换成一些未知的值
继续运行之后,会改变原本的汇编代码。请看清楚
页: [1]
查看完整版本: 王爽检测点10.5 里的AX值为什么等于3?求高手详细解答。