|
主题 : : 监测点10.4 [待解决] |
回复[ 8次 ]
点击[ 550次 ] | |
|
|
|
|
[帖 主]
[ 发表时间: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的值没有说明啊 | | |
|
|
|
|
[第1楼]
[ 回复时间:2013-06-15 23:33 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2013-06-11 13:26 |
初始时(sp)=0000h
call ax后,(ip)入栈,(sp)=(sp)-2,
--->(sp)=FFFEh啦 | | |
|
|
|
|
[第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 | | |
|
|
|
|
[第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段的内容,两者可以一定相等吗? | | |
|
|
|
|
[第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
- | | |
|
|
|
|
[第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段里的内容。 | | |
|
|
|
|
[第6楼]
[ 回复时间:2014-07-27 00:28 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2014-07-23 21:49 |
回复:[第1楼]
------------------
这里ip入栈时候的值是多少 | | |
|
|
|
|
[第7楼]
[ 回复时间:2014-11-01 00:09 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2014-10-22 05:13 |
这里ds段跟stack段能等同么 不在意sp的值? | | |
|
|
|
|
[第8楼]
[ 回复时间:2014-12-04 17:03 ]
[引用]
[回复]
[ top ] | |
荣誉值:0
信誉值:0
注册日期:2014-12-04 16:59 |
这里的[bp]等于是取了ss里的段里,[bp]为偏移地址的内容,bp做偏移地址默认为ss段 | | |