内存地址 机器码 汇编指令
1000:0 b8 00 00 mov ax,6
1000:2 ff d0 call,ax
1000:5 40 inc ax
1000:6 mov bp,sp
add ax,[bp]
第四行 sp是否等于 0fffeh
9 个解决方案
#1
补充一下 问题是程序执行完毕后,ax的值是多少
#2
在执行了
call ax
的时候
指令寄存器会指向下一条指令的起始地址,也就是
1000:5 inc ax
然后指令寄存器ip=5要压入堆栈
然后跳转到cs:ax指定的地址执行
又因为此时ax中的值为6 ,cs=1000
所以跳转到1000:6执行
于是修改 ip为6
到此时call ax指令才执行完毕
然后就执行
mov bp,sp
因为sp里面放的是堆顶的地址,所以bp也是栈顶的地址了
之后
add ax,[bp]
因为,bp里面放的是栈顶的地址,所以 [bp] 寄存器寻址后 [bp]实际是代表该地址单元的内容,也就是栈顶的内容,因为先前我把ip压入了堆栈,所以[bp]得到的内容就是5(先前在call ax时候压入的ip的值)
所以 ax=ax+[bp]
也就是 ax=6+5=B
call ax
的时候
指令寄存器会指向下一条指令的起始地址,也就是
1000:5 inc ax
然后指令寄存器ip=5要压入堆栈
然后跳转到cs:ax指定的地址执行
又因为此时ax中的值为6 ,cs=1000
所以跳转到1000:6执行
于是修改 ip为6
到此时call ax指令才执行完毕
然后就执行
mov bp,sp
因为sp里面放的是堆顶的地址,所以bp也是栈顶的地址了
之后
add ax,[bp]
因为,bp里面放的是栈顶的地址,所以 [bp] 寄存器寻址后 [bp]实际是代表该地址单元的内容,也就是栈顶的内容,因为先前我把ip压入了堆栈,所以[bp]得到的内容就是5(先前在call ax时候压入的ip的值)
所以 ax=ax+[bp]
也就是 ax=6+5=B
#3
ddrmsdos(handong) 解释的太清楚了。完全正确。
#4
顶
#5
谢谢各位 明白了
#6
解释的很清楚啊! 嘿嘿 07年的帖子 感悟很深啊!
#7
明白了 明白了谢谢!
#8
再次学习了 ....
#9
inc ax jiu bu zhixing le ?
#1
补充一下 问题是程序执行完毕后,ax的值是多少
#2
在执行了
call ax
的时候
指令寄存器会指向下一条指令的起始地址,也就是
1000:5 inc ax
然后指令寄存器ip=5要压入堆栈
然后跳转到cs:ax指定的地址执行
又因为此时ax中的值为6 ,cs=1000
所以跳转到1000:6执行
于是修改 ip为6
到此时call ax指令才执行完毕
然后就执行
mov bp,sp
因为sp里面放的是堆顶的地址,所以bp也是栈顶的地址了
之后
add ax,[bp]
因为,bp里面放的是栈顶的地址,所以 [bp] 寄存器寻址后 [bp]实际是代表该地址单元的内容,也就是栈顶的内容,因为先前我把ip压入了堆栈,所以[bp]得到的内容就是5(先前在call ax时候压入的ip的值)
所以 ax=ax+[bp]
也就是 ax=6+5=B
call ax
的时候
指令寄存器会指向下一条指令的起始地址,也就是
1000:5 inc ax
然后指令寄存器ip=5要压入堆栈
然后跳转到cs:ax指定的地址执行
又因为此时ax中的值为6 ,cs=1000
所以跳转到1000:6执行
于是修改 ip为6
到此时call ax指令才执行完毕
然后就执行
mov bp,sp
因为sp里面放的是堆顶的地址,所以bp也是栈顶的地址了
之后
add ax,[bp]
因为,bp里面放的是栈顶的地址,所以 [bp] 寄存器寻址后 [bp]实际是代表该地址单元的内容,也就是栈顶的内容,因为先前我把ip压入了堆栈,所以[bp]得到的内容就是5(先前在call ax时候压入的ip的值)
所以 ax=ax+[bp]
也就是 ax=6+5=B
#3
ddrmsdos(handong) 解释的太清楚了。完全正确。
#4
顶
#5
谢谢各位 明白了
#6
解释的很清楚啊! 嘿嘿 07年的帖子 感悟很深啊!
#7
明白了 明白了谢谢!
#8
再次学习了 ....
#9
inc ax jiu bu zhixing le ?