鱼C论坛

 找回密码
 立即注册
查看: 2688|回复: 16

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

[复制链接]
发表于 2013-5-7 19:16:52 | 显示全部楼层 |阅读模式
3鱼币
  1. assume cs:code

  2. stack segment

  3.      dw 8 dup (0)

  4. stack ends

  5. code segment

  6. start:   mov ax,stack

  7.      mov ss,ax

  8.      mov sp,16

  9.      mov ds,ax

  10.      mov ax,0

  11.      call word ptr ds:[0eh]

  12.      inc ax

  13.      inc ax

  14.      inc ax

  15.      mov ax,4c00h

  16.      int 21h

  17. code ends

  18. end start
复制代码
其中的call word ptr ds:[0eh]里的ds:[0eh]不是存放着00吗?
call word ptr ds:[0eh] 这句代码应该如何正确理解?

最佳答案

查看完整内容

自问自答,很好;P
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2013-5-7 19:16:53 | 显示全部楼层
自问自答,很好;P
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-7 20:46:38 | 显示全部楼层
果然大神都不愿意关注这小题。。我自己琢磨出来了!  ax=3

ss和ds指向同一个地址,里面存放着16个字节的0。

接着当代码执行到call word ptr ds:[0eh],会先push下一个地址的ip,即11h,然后word ptr ds:[0eh]里是存放着00,接着会跳到start处继续执行到call word ptr ds:[0eh]时,因为ds和ss使用的是栈,所以word ptr ds:[0eh]里存放着是11h。然后ip就会转到偏移为11h的地址,执行3次inc ax后。

最后得出ax=3.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-5-7 23:37:34 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-9 03:17:53 | 显示全部楼层
我只是路过打酱油的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-13 22:55:35 | 显示全部楼层
comethat 发表于 2013-5-7 23:37
没办法- -  没人回答,只能自己揣摩!!!鱼B给你吧-!

客气真客气呵呵
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-30 12:30:45 | 显示全部楼层
本帖最后由 mumu2218 于 2013-5-30 12:38 编辑

果然大神都不愿意关注这小题。。我自己琢磨出来了!  ax=3

ss和ds指向同一个地址,里面存放着16个字节的0。

接着当代码执行到call word ptr ds:[0eh],会先push下一个地址的ip,即11h,然后word ptr ds:[0eh]里是存放着00,接着会跳到start处继续执行到call word ptr ds:[0eh]时,因为ds和ss使用的是栈,所以word ptr ds:[0eh]里存放着是11h。然后ip就会转到偏移为11h的地址,执行3次inc ax后。

最后得出ax=3.                        我知道是把INC AX 的偏移地址 放进栈  PUSH 进去的11H 是怎么算出来的,  我纠结了下,那个命令占多少个偏移 一直不太明白 为什么是11H  然后word ptr ds:[0eh】里面的值不是0吗?开始不是定义了为0吗?? 那如果改成跳到  word ptr ds:[0Ah]   那个里值是什么  这里最纠结,,,,
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-31 21:10:38 | 显示全部楼层
comethat 发表于 2013-5-7 20:46
果然大神都不愿意关注这小题。。我自己琢磨出来了!  ax=3

ss和ds指向同一个地址,里面存放着16个字节的 ...

我现在也在纠结这个问题,可是我想知道的是word ptr ds:[0eh]里为什么就存放的是00呢?
那个好像没有赋值,内存地址一般不赋值就默认为0么?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-31 21:11:45 | 显示全部楼层
空陌 发表于 2013-5-31 21:10
我现在也在纠结这个问题,可是我想知道的是word ptr ds:[0eh]里为什么就存放的是00呢?
那个好像没有赋值 ...

为什么ss和ds会指向同一个地址呢,从代码中哪里可以看出来啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-5-31 21:18:07 | 显示全部楼层
真不好意思,先前没有看全,楼主的解释很详细,3Q
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-1 06:20:04 | 显示全部楼层
无回帖,不论坛,这才是人道。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-1 21:53:31 | 显示全部楼层
mumu2218 发表于 2013-5-30 12:30
果然大神都不愿意关注这小题。。我自己琢磨出来了!  ax=3

ss和ds指向同一个地址,里面存放着16个字节的 ...

ds和ss指向同一个地址的.那个
word ptr ds:[0eh]
在内存历史实际就是 第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:[0eh]里的值就是11h了 之前push进去的
然后他就会跳到inc ax这条语句执行3次后, 最后得出结果ax=3;

如果还听不懂,那我无能为力了!:lol
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-5 16:12:36 | 显示全部楼层
懂了,呵呵 ,雾散了, 走死胡同了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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=0000  BX=0000  CX=0029  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=13D9  ES=13D9  SS=13E9  CS=13EA  IP=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    [000E]
13EA:0011 40            INC     AX    <----    按字面分析call word ptr ds:[0eh] 就是把偏移地址PUSH进ss同时SP指向SP-2=oeh
13EA:0012 40            INC     AX                位置,然后JMP ds:[0eh]  ds ss被设置为同一个段=jmp ss:[0eh]=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     [BX+SI],AL
13EA:001B 0000          ADD     [BX+SI],AL


-d ss:0
13E9:0000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13E9:0010  B8 E9
-t


AX=13E9  BX=0000  CX=0029  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000
DS=13D9  ES=13D9  SS=13E9  CS=13EA  IP=0003   NV UP EI PL NZ NA PO NC
13EA:0003 8ED0          MOV     SS,AX
-d ss:0
13E9:0000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................
13E9:0010  B8 E9
-t


AX=13E9  BX=0000  CX=0029  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=13D9  ES=13D9  SS=13E9  CS=13EA  IP=0008   NV UP EI PL NZ NA PO NC
13EA:0008 8ED8          MOV     DS,AX
-d ss:0
13E9:0000  00 00 00 00 00 00 E9 13-00 00 08 00 EA 13 EB 0D   ................   <--还没PUSH哦,段里被写进数据
13E9:0010  B8 E9  《----未PUSH进数据,sp指向这里10h [b8 e9]  


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-17 05:08:36 | 显示全部楼层
本帖最后由 yearn2005 于 2013-6-17 06:39 编辑

继续TTTTTT  第2个让我纠结的地方来了  看红色的注释

-t


AX=13E9  BX=0000  CX=0029  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=13E9  ES=13D9  SS=13E9  CS=13EA  IP=000A   NV UP EI PL NZ NA PO NC
13EA:000A B80000        MOV     AX,0000
-d ss:0
13E9:0000  00 00 00 00 00 00 E9 13-00 00 0A 00 EA 13 EB 0D   ................
13E9:0010  B8 E9
-t

AX=0000  BX=0000  CX=0029  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=13E9  ES=13D9  SS=13E9  CS=13EA  IP=000D   NV UP EI PL NZ NA PO NC
13EA:000D FF160E00      CALL    [000E]                     DS:000E=0DEB  《-这里JMP的地址是0DEB?还是会被改写成0011
-d ss:0                                                                                                       再JMP?  按书本先PUSH再JMP。查看了 DS :0deb
13E9:0000  00 00 00 00 00 00 00 00-00 00 0D 00 EA 13 EB 0D   ............位置数据是0000,最后实际跳转的位置是下面的
13E9:0010  B8 E9 13 8E D0 BC 10 00-8E D8 B8 00 00 FF 16 0E   ...............IP=3302
13E9:0020  00 40 40 40 B8 00 4C CD-21 00 00 00 00 00 00 00   .@@@..L.!.......


-t


AX=0000  BX=0000  CX=0029  DX=0000  SP=000E  BP=0000  SI=0000  DI=0000
DS=13E9  ES=13D9  SS=13E9 CS=13EA  IP=3302   NV UP EI PL NZ NA PO NC 这里为什么IP跳到3302发帖的时候还没想明白
13EA:3302 0000          ADD     [BX+SI],AL                         DS:0000=00            
-
-d ss:0
13E9:0000  00 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    [000E]
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     [BX+SI],AL
13EA:001B 0000          ADD     [BX+SI],AL.


想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2013-6-17 16:32:30 | 显示全部楼层
本帖最后由 comethat 于 2013-6-17 16:33 编辑

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

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

第一个问题里的13EA:0011  这个就是ip的地址呗  所以就11h
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2013-6-17 23:44:21 | 显示全部楼层
本帖最后由 yearn2005 于 2013-6-18 00:19 编辑

简单说 栈段初始化后的确都是0,最后PUSH进去的的确是0011 ,实际jmp的不是0011,这个没想明白。AX=13E9  BX=0000  CX=0029  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=13D9  ES=13D9  SS=13E9  CS=13EA  IP=0008   NV UP EI PL NZ NA PO NC
13EA:0008 8ED8          MOV     DS,AX
-d ss:0
13E9:0000  00 00 00 00 00 00 E9 13-00 00 08 00 EA 13 EB 0D   ................   <--还没PUSH哦,段里被写进数据
13E9:0010  B8 E9  《----未PUSH进数据,sp指向这里10h [b8 e9]             你看这段,没到call指令呢 ,0e的位置 00 00被改写成eb 0d了 -t
AX=0000  BX=0000  CX=0029  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000
DS=13E9  ES=13D9  SS=13E9  CS=13EA  IP=000D   NV UP EI PL NZ NA PO NC
13EA:000D FF160E00      CALL    [000E]                             DS:000E=0DEB

问题就来了,执行完call word ptr ds:[0eh] 后[0eh]内的确是0011h,如果call word ptr ds:[0eh]=先PUSH在JMP的话那么cs应该指向 cs:0011H
看紫色的字 (DOS的回显),它执行的是没PUSH进去的值 0DEB,也就是CS指向 cs:0deb
那到底是先push 还是先JMP呢?
我的电脑上这2个结果都不是.
结果是cs指向了cs:3302。这才是我纠结的地方
AX=0000  BX=0000  CX=0029  DX=0000  SP=000E  BP=0000  SI=0000  DI=0000
DS=13E9  ES=13D9  SS=13E9  CS=13EA  IP=3302











想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-24 02:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表