. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->CALL和RET指令
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  监测点10.4  [待解决] 回复[ 8次 ]   点击[ 550次 ]  
huibian2014
[帖 主]   [ 发表时间:2013-05-02 21:15 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-03-10 11:42
检测点10.4

下面的程序执行后,ax中的数值为多少?

内存地址   机器码        汇编指令       执行后情况

1000:0     b8 06 00      mov ax,6       ax=6,ip指向1000:3

1000:3     ff d0         call ax        pop ip,ip指向1000:6

1000:5     40            inc ax

1000:6     58            mov bp,sp      bp=sp=fffeh

                         add ax,[bp]    ax=[6+ds:(fffeh)]=6+5=0bh



这其中的bp=sp=fffeh的值是怎么回事??sp的值没有说明啊
xcf0631
[第1楼]   [ 回复时间:2013-06-15 23:33 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-06-11 13:26
初始时(sp)=0000h
call ax后,(ip)入栈,(sp)=(sp)-2,
--->(sp)=FFFEh啦
hehahe
[第2楼]   [ 回复时间:2013-07-22 09:53 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-06-29 22:28
这题无需在意sp的值.
Mov ax,6 ;ax=6
call ax ;跳到1000:6
Inc ax
Mov bp,sp ;bp=sp的值,即sp地址。
Add ax,[bp]  ;[bp]相当于sp地址的内容:5
最终结果ax=6+5=b
cncser
[第3楼]   [ 回复时间:2014-02-07 09:58 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-02-02 10:57
mov ax, 6        ;ax = 6
call ax          ;跳到1000:6
inc ax
mov bp, sp       ;bp = sp的值,即sp地址fffeh
add ax, [bp]     ;[bp]相当于sp地址的内容:5。        疑问:此处的[bp]应该是DS段的内容,而[sp]是SS段的内容,两者可以一定相等吗?
cncser
[第4楼]   [ 回复时间:2014-02-07 10:11 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-02-02 10:57
debug中,此处显示的是SS段中的内容!!!那这里的[bp]到底是DS段呢?还是SS段呢?
-r
AX=0000  BX=0000  CX=0010  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B51  CS=0B51  IP=0000   NV UP EI PL NZ NA PO NC
0B51:0000 B80600        MOV     AX,0006
-t

AX=0006  BX=0000  CX=0010  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B51  CS=0B51  IP=0003   NV UP EI PL NZ NA PO NC
0B51:0003 FFD0          CALL    AX
-t

AX=0006  BX=0000  CX=0010  DX=0000  SP=FFFE  BP=0000  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B51  CS=0B51  IP=0006   NV UP EI PL NZ NA PO NC
0B51:0006 8BEC          MOV     BP,SP
-t

AX=0006  BX=0000  CX=0010  DX=0000  SP=FFFE  BP=FFFE  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B51  CS=0B51  IP=0008   NV UP EI PL NZ NA PO NC
0B51:0008 034600        ADD     AX,[BP+00]                         SS:FFFE=0005
-t

AX=000B  BX=0000  CX=0010  DX=0000  SP=FFFE  BP=FFFE  SI=0000  DI=0000
DS=0B41  ES=0B41  SS=0B51  CS=0B51  IP=000B   NV UP EI PL NZ NA PO NC
0B51:000B B8004C        MOV     AX,4C00
-
cncser
[第5楼]   [ 回复时间:2014-02-07 10:17 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2013-02-02 10:57
网上搜了一下,或许这才是问题的解决吧:

BP它的确是一个寄存器,但它的用途有点特殊,是和堆栈指针SP联合使用的,作为SP校准使用的,只有在寻找堆栈里的数据和使用个别的寻址方式时候才能用到。
比如说,堆栈中压入了很多数据或者地址,你肯定想通过SP来访问这些数据或者地址,但SP是要指向栈顶的,是不能随便乱改的,这时候你就需要使用BP,把SP的值传递给BP,通过BP来寻找堆栈里数据或者地址。它默认搭配的段寄存器就是SS-堆栈段寄存器,而不是我理解的[bp]是DS段里的内容。
863277233
[第6楼]   [ 回复时间:2014-07-27 00:28 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-07-23 21:49
回复:[第1楼]
------------------
这里ip入栈时候的值是多少
yo_yo_li
[第7楼]   [ 回复时间:2014-11-01 00:09 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-10-22 05:13
这里ds段跟stack段能等同么 不在意sp的值?
6952356
[第8楼]   [ 回复时间:2014-12-04 17:03 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2014-12-04 16:59
这里的[bp]等于是取了ss里的段里,[bp]为偏移地址的内容,bp做偏移地址默认为ss段
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved