检测点10.2 下面的程序执行后,AX中的数值为多少?
assume cs:codesgcodesg segment
start:
mov ax,0
call s;
inc ax
s:pop ax;
codesg ends
end start
怎么算的?谁能具体说下谢谢啦~~(我是新手)
inc ax 的地址 楼主,首先要知道,call的功能,call调用,第一步把ip的值push压栈了,第二步跳转。
而压栈的ip值是指向call s;这一句的下一句的,即是 inc ax 的地址。(因为cpu在执行call语句的时候 ip会自增到下一句的地址)。
pop ax,就等于是把栈中ip的值给了ax。而前面分析知道栈中ip的值就是 inc ax的地址。所以,ax为inc ax的地址值 call指令执行时有两步操作。第一步将当前ip的值压入栈顶(此时ip是指向inc ax这条指令的),第二步跳转到s子程序中进行执行。也就是pop ax,此时栈顶的值是刚刚被压入的ip的值,也就是inc ax这条指令所在的内存地址。而inc ax这条指令没有被得到执行的原因是,s子程序没有返回,s子程序执行完后直接向下执行 ssume cs:codesg
codesg segment
start:
mov ax,0 -------- ax=0
call s; -----------跳到s保存跳转到的内存给EBP-4的位置
inc ax -----------不读
s:pop ax;---------进入S 读出ax 读的位置是EBP+4位置的内容
codesg ends -----------------所以ax等于系统给分配的一个内存 具体要看call跳转安排的内存
end start
ssume cs:codesg
codesg segment
start:
mov ax,0 -------- ax=0
call s; -----------跳到s保存跳转到的内存给EBP-4的位置
inc ax -----------不读
s:pop ax;---------进入S 读出ax 读的位置是EBP+4位置的内容
codesg ends -----------------所以ax等于系统给分配的一个内存 具体要看call跳转安排的内存
end start
我是来看答案的 我跟楼上一个目的 我也是跟楼上和楼楼上一个目的,和另外一个目的 俺也看到这里纠结了。。。。。:'( 你确定你的代码没有写错???
程序无法正常返回 call 相当于push call 下一句代码的地址 + jmp 跳到标号 ,由于你没有返回,pop出来的值肯定是 call 下一句的地址(inc ax)
页:
[1]