王爽汇编第二版书里的检测点10.5,求解
assume cs:codestack segment
dw 8 dup (0)
stack ends
code segment
start: mov ax,stack
mov ss,ax
mov sp,16
mov ds,ax
mov ax,0
call word ptr ds:
inc ax
inc ax
inc ax
mov ax,4c00h
int 21h
code ends
end start
其中的call word ptr ds:里的ds:不是存放着00吗?
call word ptr ds: 这句代码应该如何正确理解?
自问自答,很好;P 果然大神都不愿意关注这小题。。我自己琢磨出来了!ax=3
ss和ds指向同一个地址,里面存放着16个字节的0。
接着当代码执行到call word ptr ds:,会先push下一个地址的ip,即11h,然后word ptr ds:里是存放着00,接着会跳到start处继续执行到call word ptr ds:时,因为ds和ss使用的是栈,所以word ptr ds:里存放着是11h。然后ip就会转到偏移为11h的地址,执行3次inc ax后。
最后得出ax=3. NGtailang 发表于 2013-5-7 21:45 static/image/common/back.gif
自问自答,很好
没办法- -没人回答,只能自己揣摩!!!鱼B给你吧-! 我只是路过打酱油的。 comethat 发表于 2013-5-7 23:37 static/image/common/back.gif
没办法- -没人回答,只能自己揣摩!!!鱼B给你吧-!
客气真客气呵呵 本帖最后由 mumu2218 于 2013-5-30 12:38 编辑
果然大神都不愿意关注这小题。。我自己琢磨出来了!ax=3
ss和ds指向同一个地址,里面存放着16个字节的0。
接着当代码执行到call word ptr ds:,会先push下一个地址的ip,即11h,然后word ptr ds:里是存放着00,接着会跳到start处继续执行到call word ptr ds:时,因为ds和ss使用的是栈,所以word ptr ds:里存放着是11h。然后ip就会转到偏移为11h的地址,执行3次inc ax后。
最后得出ax=3. 我知道是把INC AX 的偏移地址 放进栈PUSH 进去的11H 是怎么算出来的,我纠结了下,那个命令占多少个偏移 一直不太明白 为什么是11H然后word ptr ds: 那个里值是什么这里最纠结,,,, comethat 发表于 2013-5-7 20:46 static/image/common/back.gif
果然大神都不愿意关注这小题。。我自己琢磨出来了!ax=3
ss和ds指向同一个地址,里面存放着16个字节的 ...
我现在也在纠结这个问题,可是我想知道的是word ptr ds:里为什么就存放的是00呢?
那个好像没有赋值,内存地址一般不赋值就默认为0么? 空陌 发表于 2013-5-31 21:10 static/image/common/back.gif
我现在也在纠结这个问题,可是我想知道的是word ptr ds:里为什么就存放的是00呢?
那个好像没有赋值 ...
为什么ss和ds会指向同一个地址呢,从代码中哪里可以看出来啊? 真不好意思,先前没有看全,楼主的解释很详细,3Q 无回帖,不论坛,这才是人道。 mumu2218 发表于 2013-5-30 12:30 static/image/common/back.gif
果然大神都不愿意关注这小题。。我自己琢磨出来了!ax=3
ss和ds指向同一个地址,里面存放着16个字节的 ...
ds和ss指向同一个地址的.那个
word ptr ds:
在内存历史实际就是 第e,f里分别放着00 00
1个word=2个字节
push进去的11h是机器码的字节数算出来的就是从start的mov ax,stack到call ...一共有(hex)11h=(dec)17个字节.
word ptr ds:[0eh】 push进去的是0h就是偏移为0所以要又要跳到start处开始执行的.
然后继续下来一遍,当再执行到call语句的时候,这是word ptr ds:里的值就是11h了 之前push进去的
然后他就会跳到inc ax这条语句执行3次后, 最后得出结果ax=3;
如果还听不懂,那我无能为力了!:lol 懂了,呵呵 ,雾散了, 走死胡同了。。。 本帖最后由 yearn2005 于 2013-6-17 06:30 编辑
10.5题目我也纠结了,虽然课本说不要在SEBUG中单布跟踪,不过跟踪下也没什么坏处啊。这个程序定义了 assume cs:code 但没定义ds ss. 运行到MOV DS,AX后 没CALL之前栈段里就有数据(红色的字)了哦,我在这里纠结了很久,后来发现栈段被同时定义为 ss ds 段后,貌似这里会存放机器码或标志(有大虾出来确定下不?要不可能要学到很后面才恍然大雾)。
F:\a>debug 105.exe
-r
AX=0000BX=0000CX=0029DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13D9ES=13D9SS=13E9CS=13EAIP=0000 NV UP EI PL NZ NA PO NC
13EA:0000 B8E913 MOV AX,13E9
-u
13EA:0000 B8E913 MOV AX,13E9
13EA:0003 8ED0 MOV SS,AX
13EA:0005 BC1000 MOV SP,0010
13EA:0008 8ED8 MOV DS,AX
13EA:000A B80000 MOV AX,0000
13EA:000D FF160E00 CALL
13EA:0011 40 INC AX <---- 按字面分析call word ptr ds: 就是把偏移地址PUSH进ss同时SP指向SP-2=oeh
13EA:0012 40 INC AX 位置,然后JMP ds:ds ss被设置为同一个段=jmp ss:=jmp cs:0011
13EA:0013 40 INC AX 所以按字面分析最终AX=3
13EA:0014 B8004C MOV AX,4C00
13EA:0017 CD21 INT 21
13EA:0019 0000 ADD ,AL
13EA:001B 0000 ADD ,AL
-d ss:0
13E9:000000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13E9:0010B8 E9
-t
AX=13E9BX=0000CX=0029DX=0000SP=0000BP=0000SI=0000DI=0000
DS=13D9ES=13D9SS=13E9CS=13EAIP=0003 NV UP EI PL NZ NA PO NC
13EA:0003 8ED0 MOV SS,AX
-d ss:0
13E9:000000 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
13E9:0010B8 E9
-t
AX=13E9BX=0000CX=0029DX=0000SP=0010BP=0000SI=0000DI=0000
DS=13D9ES=13D9SS=13E9CS=13EAIP=0008 NV UP EI PL NZ NA PO NC
13EA:0008 8ED8 MOV DS,AX
-d ss:0
13E9:000000 00 00 00 00 00 E9 13-00 00 08 00 EA 13 EB 0D ................ <--还没PUSH哦,段里被写进数据
13E9:0010B8 E9《----未PUSH进数据,sp指向这里10h
本帖最后由 yearn2005 于 2013-6-17 06:39 编辑
继续TTTTTT第2个让我纠结的地方来了看红色的注释
-t
AX=13E9BX=0000CX=0029DX=0000SP=0010BP=0000SI=0000DI=0000
DS=13E9ES=13D9SS=13E9CS=13EAIP=000A NV UP EI PL NZ NA PO NC
13EA:000A B80000 MOV AX,0000
-d ss:0
13E9:000000 00 00 00 00 00 E9 13-00 00 0A 00 EA 13 EB 0D ................
13E9:0010B8 E9
-t
AX=0000BX=0000CX=0029DX=0000SP=0010BP=0000SI=0000DI=0000
DS=13E9ES=13D9SS=13E9CS=13EAIP=000D NV UP EI PL NZ NA PO NC
13EA:000D FF160E00 CALL DS:000E=0DEB《-这里JMP的地址是0DEB?还是会被改写成0011
-d ss:0 再JMP?按书本先PUSH再JMP。查看了 DS :0deb
13E9:000000 00 00 00 00 00 00 00-00 00 0D 00 EA 13 EB 0D ............位置数据是0000,最后实际跳转的位置是下面的
13E9:0010B8 E9 13 8E D0 BC 10 00-8E D8 B8 00 00 FF 16 0E ...............IP=3302
13E9:002000 40 40 40 B8 00 4C CD-21 00 00 00 00 00 00 00 .@@@..L.!.......
-t
AX=0000BX=0000CX=0029DX=0000SP=000EBP=0000SI=0000DI=0000
DS=13E9ES=13D9SS=13E9 CS=13EAIP=3302 NV UP EI PL NZ NA PO NC 这里为什么IP跳到3302发帖的时候还没想明白
13EA:3302 0000 ADD ,AL DS:0000=00
-
-d ss:0
13E9:000000 00 00 00 00 00 00 00-02 33 EA 13 EB 0D 11 00 .........3......栈段0EH位置的字形数据是00 11和之前分析是一样的
-u
13EA:0000 B8E913 MOV AX,13E9
13EA:0003 8ED0 MOV SS,AX
13EA:0005 BC1000 MOV SP,0010
13EA:0008 8ED8 MOV DS,AX
13EA:000A B80000 MOV AX,0000
13EA:000D FF160E00 CALL
13EA:0011 40 INC AX 偏移地址0011
13EA:0012 40 INC AX
13EA:0013 40 INC AX
13EA:0014 B8004C MOV AX,4C00
13EA:0017 CD21 INT 21
13EA:0019 0000 ADD ,AL
13EA:001B 0000 ADD ,AL.
本帖最后由 comethat 于 2013-6-17 16:33 编辑
看不懂写什么真乱啊!!
call就是push下调指令的地址然后jmp地址
jmp在机器码里显示的位移量不是绝对地址
第一个问题里的13EA:0011这个就是ip的地址呗所以就11h 本帖最后由 yearn2005 于 2013-6-18 00:19 编辑
简单说 栈段初始化后的确都是0,最后PUSH进去的的确是0011 ,实际jmp的不是0011,这个没想明白。AX=13E9BX=0000CX=0029DX=0000SP=0010BP=0000SI=0000DI=0000
DS=13D9ES=13D9SS=13E9CS=13EAIP=0008 NV UP EI PL NZ NA PO NC
13EA:0008 8ED8 MOV DS,AX
-d ss:0
13E9:000000 00 00 00 00 00 E9 13-00 00 08 00 EA 13 EB 0D ................ <--还没PUSH哦,段里被写进数据
13E9:0010B8 E9《----未PUSH进数据,sp指向这里10h 你看这段,没到call指令呢 ,0e的位置 00 00被改写成eb 0d了 -t
AX=0000BX=0000CX=0029DX=0000SP=0010BP=0000SI=0000DI=0000
DS=13E9ES=13D9SS=13E9CS=13EAIP=000D NV UP EI PL NZ NA PO NC
13EA:000D FF160E00 CALL DS:000E=0DEB
问题就来了,执行完call word ptr ds: 后内的确是0011h,如果call word ptr ds:=先PUSH在JMP的话那么cs应该指向 cs:0011H
看紫色的字 (DOS的回显),它执行的是没PUSH进去的值 0DEB,也就是CS指向 cs:0deb
那到底是先push 还是先JMP呢?
我的电脑上这2个结果都不是.
结果是cs指向了cs:3302。这才是我纠结的地方
AX=0000BX=0000CX=0029DX=0000SP=000EBP=0000SI=0000DI=0000
DS=13E9ES=13D9SS=13E9CS=13EAIP=3302
页:
[1]