王爽检测点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 你仔细看下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: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
你说的我还不不明白。我的想法是当ax执行3次是不是从mov ax,0处开始执行,然后跳转到inc ax出执行3次就变成3了! 了缺(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
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 你搞懂这两个指令了就知道问题所在了!
http://bbs.fishc.com/thread-20370-1-1.html看看这个帖子呢。 呵呵,看看我的帖子把,最简单的解法,http://bbs.fishc.com/thread-19409-1-1.html 这题根本就不能用DEBUG,否则和实际答案不匹配。 Uchiha 很感谢你的讲解,我明白了,你讲的非常不错,我给你满分:lol 谢谢谢谢:lol 丶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]