zer0 发表于 2013-5-7 19:16:52

王爽汇编第二版书里的检测点10.5,求解

assume cs:code

stack 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: 这句代码应该如何正确理解?

NGtailang 发表于 2013-5-7 19:16:53

自问自答,很好;P

zer0 发表于 2013-5-7 20:46: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.

zer0 发表于 2013-5-7 23:37:34

NGtailang 发表于 2013-5-7 21:45 static/image/common/back.gif
自问自答,很好
没办法- -没人回答,只能自己揣摩!!!鱼B给你吧-!

围巢 发表于 2013-5-9 03:17:53

我只是路过打酱油的。

NGtailang 发表于 2013-5-13 22:55:35

comethat 发表于 2013-5-7 23:37 static/image/common/back.gif
没办法- -没人回答,只能自己揣摩!!!鱼B给你吧-!

客气真客气呵呵

mumu2218 发表于 2013-5-30 12:30:45

本帖最后由 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:   那个里值是什么这里最纠结,,,,

空陌 发表于 2013-5-31 21:10:38

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:11:45

空陌 发表于 2013-5-31 21:10 static/image/common/back.gif
我现在也在纠结这个问题,可是我想知道的是word ptr ds:里为什么就存放的是00呢?
那个好像没有赋值 ...

为什么ss和ds会指向同一个地址呢,从代码中哪里可以看出来啊?

空陌 发表于 2013-5-31 21:18:07

真不好意思,先前没有看全,楼主的解释很详细,3Q

bafengao 发表于 2013-6-1 06:20:04

无回帖,不论坛,这才是人道。

zer0 发表于 2013-6-1 21:53:31

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

mumu2218 发表于 2013-6-5 16:12:36

懂了,呵呵 ,雾散了, 走死胡同了。。。

yearn2005 发表于 2013-6-17 04:59:54

本帖最后由 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 05:08:36

本帖最后由 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.


zer0 发表于 2013-6-17 16:32:30

本帖最后由 comethat 于 2013-6-17 16:33 编辑

看不懂写什么真乱啊!!
call就是push下调指令的地址然后jmp地址

jmp在机器码里显示的位移量不是绝对地址

第一个问题里的13EA:0011这个就是ip的地址呗所以就11h

yearn2005 发表于 2013-6-17 23:44:21

本帖最后由 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]
查看完整版本: 王爽汇编第二版书里的检测点10.5,求解