琼华 发表于 2013-4-19 09:31:27

检测点10.2 下面的程序执行后,AX中的数值为多少?

assume cs:codesg
codesg segment
start:
      mov ax,0
      call s;
      inc ax
       s:pop ax;
codesg ends   
end start
怎么算的?谁能具体说下谢谢啦~~(我是新手)


向往青莲 发表于 2013-4-19 11:40:10

inc ax 的地址

熊文杰 发表于 2013-4-19 12:17:41

楼主,首先要知道,call的功能,call调用,第一步把ip的值push压栈了,第二步跳转。
而压栈的ip值是指向call s;这一句的下一句的,即是 inc ax 的地址。(因为cpu在执行call语句的时候 ip会自增到下一句的地址)。
pop ax,就等于是把栈中ip的值给了ax。而前面分析知道栈中ip的值就是 inc ax的地址。所以,ax为inc ax的地址值

1971827035 发表于 2013-4-19 15:54:20

call指令执行时有两步操作。第一步将当前ip的值压入栈顶(此时ip是指向inc ax这条指令的),第二步跳转到s子程序中进行执行。也就是pop ax,此时栈顶的值是刚刚被压入的ip的值,也就是inc ax这条指令所在的内存地址。而inc ax这条指令没有被得到执行的原因是,s子程序没有返回,s子程序执行完后直接向下执行

252013680 发表于 2013-4-19 16:22:38

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

252013680 发表于 2013-4-19 16:23:14

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

pcode 发表于 2013-4-19 21:49:31

我是来看答案的

恒信电脑 发表于 2013-4-21 10:46:36

我跟楼上一个目的

dAb 发表于 2013-5-2 16:03:51

我也是跟楼上和楼楼上一个目的,和另外一个目的

mumu2218 发表于 2013-5-29 13:10:47

俺也看到这里纠结了。。。。。:'(

属専色灰 发表于 2013-5-30 23:11:39

你确定你的代码没有写错???

属専色灰 发表于 2013-5-30 23:15:14

程序无法正常返回   call    相当于push call 下一句代码的地址 + jmp 跳到标号 ,由于你没有返回,pop出来的值肯定是 call 下一句的地址(inc ax)
页: [1]
查看完整版本: 检测点10.2 下面的程序执行后,AX中的数值为多少?