. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  检测点10.3有个问题  [待解决] 回复[ 2次 ]   点击[ 488次 ]  
xuan214
[帖 主]   [ 发表时间:2009-03-20 14:02 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-02-22 23:57
下面的程序执行后,ax中的数值为多少? 
内存地址    机器码           汇编指令 
1000:0    b8 00 00            mov ax,0 
1000:3    9A 09 00 00 10    call far ptr s 
1000:8    40                inc ax 
1000:9    58                s:pop ax 
                              add ax,ax 
                              pop bx 
                              add ax,bx
        

     我想问的是为什么这里ax代表的是IP 而bx就是cs? 我实验了下 把ax和bx的位置对调下结果完全不同```
crazyman
[第1楼]   [ 回复时间:2009-03-22 14:12 ]   [引用]   [回复]   [ top ] 
荣誉值:152
信誉值:3
注册日期:2008-01-24 21:26
我想问的是为什么这里ax代表的是IP 而bx就是cs? 我实验了下 把ax和bx的位置对调下结果完全不同```
==============
楼主是没有搞明白call指令的运行机制。
1000:3    9A 09 00 00 10    call far ptr s 
这条指令运行后,已经将其下一条的段地址和偏移地址放入栈空间了,也就是相当于push 1000H 和 push 8H。
下面的指令pop ax 和pop bx 就把栈里的数据取出来了,那么ax和bx的值就会对应之前压入栈中cs和ip,自然就是楼主看到的那样了。

在做检测点的时候,一定要充分理解本章节的知识点,这样就能体会到检测题的作用了。
xuan214
[第2楼]   [ 回复时间:2009-04-13 14:47 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:4
注册日期:2009-02-22 23:57
懂咧`忘了出栈和入栈的次序了
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved