648905586 发表于 2014-10-18 13:49:36

检测点10.4问题

题目:下面的程序执行后,ax中的数据是多少?
view plaincopy



[*]内存地址      机器码      汇编指令
[*] 1000:0      b8 00 00   mov ax,0
[*] 1000:2      ff d0         call ax
[*] 1000:5      40            inc ax
[*]      
[*] 1000:6      58            mov bp,sp
[*]                           add ax,
[*]怎么知道SP的值 的



zhangleitj 发表于 2014-10-30 11:01:00

同问,好心人给讲讲:handshake

zhangleitj 发表于 2014-10-30 11:12:53

call ax ;这句为段内间接调用,其中ax是相对于当前代码段的偏移量,即6
;也就是说call ax 这句实际上是调用1000:6处的代码。但是cpu在执行1000:6处的代码之前会先将ip(下一条指令的偏移量,也就是5)入栈,以便能在call返回时找到执行call之前将要执行的下一条指令(即inc ax),然后再将6赋给ip(不过这点对此题没有影响)。

做完这些后,cpu开始执行1000:6处代码

mov bp,sp;栈顶指针保存至bp

add ax,;这句是将栈顶的数据与ax中的值相加然后放到ax中,由于整

个过程中只有在call 之前将 ip入栈,所以此时应该为5,ax最后为11

大个的糖果 发表于 2014-10-30 15:21:06

lqjstc 发表于 2014-11-9 16:53:03

zhangleitj 发表于 2014-10-30 11:12
call ax ;这句为段内间接调用,其中ax是相对于当前代码段的偏移量,即6
;也就是说call ax 这句实际上是 ...

add ax,这句不应该是将ds:处的值与ax相加吗,为什么是ss:处的值?

zhangleitj 发表于 2014-11-11 15:43:51

lqjstc 发表于 2014-11-9 16:53
add ax,这句不应该是将ds:处的值与ax相加吗,为什么是ss:处的值?

这个在百度上搜一下就知道了
页: [1]
查看完整版本: 检测点10.4问题