鱼C论坛

 找回密码
 立即注册
查看: 2547|回复: 8

10.5(2)求解

[复制链接]
发表于 2012-8-1 01:37:16 | 显示全部楼层 |阅读模式
1鱼币
assume cs:codesg
stack segment
    dw 8 dup(0)
stack ends
codesg segment
start:
    mov ax,stack
    mov ss,ax
    mov sp,10h
    mov word ptr ss:[0],offset s ;(ss:[0])=1ah
    mov ss:[2],cs                ;(ss:[2])=cs
    call dword ptr ss:[0]        ;cs入栈,ip=19h入栈,转到cs:1ah处执行指令
                                 ;(ss:[4])=cs,(ss:[6])=ip  有些答案上说这里是[0eh]=cs  [0ch]=ip?到底哪个才是对的!
    nop
s:  mov ax,offset s              ;ax=1ah
    sub ax,ss:[0ch]             ;ax=1ah-(ss:[0ch])=1ah-19h=1   这里为什么【0ch】=19h?
    mov bx,cs                   ;bx=cs=0c5bh               
    sub bx,ss:[0eh]              ;bx=cs-cs=0               ss:[0eh]=cs?why?
    mov ax,4c00h
    int 21h
codesg ends
end start

最佳答案

查看完整内容

你如果把10.4我给你解释的弄懂了。这题问题不大,关键就是你要弄懂栈和call。给你看下我的debug图。 看到了把,call后面的指令的第一个字节的ip为0019h,这是什么决定的呢?就是从程序的入口到执行到call的总共占用的机器码决定的,这题总共占了19个字节。所以就这样了。 注意这里是call dword ptr 内存单元地址哦。相当于: push cs push ip jmp dword ptr 内存单元地址 这题关键就是这条命令 执行完了后,栈中的情 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
发表于 2012-8-1 01:37:17 | 显示全部楼层
你如果把10.4我给你解释的弄懂了。这题问题不大,关键就是你要弄懂栈和call。给你看下我的debug图。
10.5.png
看到了把,call后面的指令的第一个字节的ip为0019h,这是什么决定的呢?就是从程序的入口到执行到call的总共占用的机器码决定的,这题总共占了19个字节。所以就这样了。

注意这里是call dword ptr 内存单元地址哦。相当于:
push cs
push ip
jmp dword ptr 内存单元地址

这题关键就是这条命令
call dword ptr ss:[0]
执行完了后,栈中的情况是什么样的呢。注意开始题目中给出了栈段和sp。要注意利用。

505.bmp
注意栈是以字为单位的,就是2个字节。这样先把cs入栈占用两个字节,sp自减2,sp=0eh。这时候ss:0eh字单元里面存放的是cs的内容,比如我的debug图中就是0b67h。然后再把ip入栈,sp自减2,sp=0ch,这时候ss:0ch字单元里面存放的是ip的内容,这个ip是call指令后的第一个字节的ip,我的debug图中是0019h。

入栈结束,就可以jmp dword ptr ss:[0]了。其实也就是跳到s标号处执行,因为执行了这步
mov word ptr ss:[0],offset s
你的问题应该能解决了吧。我感觉我好啰嗦啊。不懂再回吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-1 12:32:06 | 显示全部楼层
你把上面的弄明白了,就去看看这个帅哥的帖子http://bbs.fishc.com/thread-19409-1-1.html。其实就是利用了call的用法,以及nop占一个字节
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-1 12:52:11 | 显示全部楼层

非常感谢 ,你用的是什么编辑器?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-1 12:58:08 | 显示全部楼层
丶Haw 发表于 2012-8-1 12:52
非常感谢 ,你用的是什么编辑器?

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

使用道具 举报

 楼主| 发表于 2012-8-3 22:03:27 | 显示全部楼层

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:[0eh]

     inc ax

     inc ax

     inc ax

     mov ax,4c00h

     int 21h

code ends

end start

u指令查看是

0C50:0000 B84F0C        MOV     AX,0C4F

0C50:0003 8ED0          MOV     SS,AX

0C50:0005 BC1000        MOV     SP,0010

0C50:0008 8ED8          MOV     DS,AX

0C50:000A B80000        MOV     AX,0000

0C50:000D FF160E00      CALL    [000E]

0C50:0011 40            INC     AX

0C50:0012 40            INC     AX

0C50:0013 40            INC     AX

0C50:0014 B8004C        MOV     AX,4C00

0C50:0017 CD21          INT     21

这个题目,用debug 后,
call [0eh]
下面怎么跑到别的地方去了!而没有运行下面的程序,这是为什么?求解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-3 22:03:59 | 显示全部楼层
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:[0eh]

     inc ax

     inc ax

     inc ax

     mov ax,4c00h

     int 21h

code ends

end start

u指令查看是

0C50:0000 B84F0C        MOV     AX,0C4F

0C50:0003 8ED0          MOV     SS,AX

0C50:0005 BC1000        MOV     SP,0010

0C50:0008 8ED8          MOV     DS,AX

0C50:000A B80000        MOV     AX,0000

0C50:000D FF160E00      CALL    [000E]

0C50:0011 40            INC     AX

0C50:0012 40            INC     AX

0C50:0013 40            INC     AX

0C50:0014 B8004C        MOV     AX,4C00

0C50:0017 CD21          INT     21

这个题目,用debug 后,
call [0eh]
下面怎么跑到别的地方去了!而没有运行下面的程序,这是为什么?求解!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2012-8-3 22:05:19 | 显示全部楼层
检测点10.5

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

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:[0eh]

     inc ax

     inc ax

     inc ax

     mov ax,4c00h

     int 21h

code ends

end start



推算:

执行call word ptr ds:[0eh]指令时,先cs入栈,再ip=11入栈,最后ip转移到(ds:[0eh])。(ds:[0eh])=11h,执行inc ax……最终ax=3



题中特别关照别用debug跟踪,跟踪结果不一定正确,但还是忍不住去试试,看是什么结果。

根据单步跟踪发现,执行call word ptr ds:[0eh]指令时,显示ds:[0eh]=065D。

ds:0000~ds:0010不是已设置成stack数据段了嘛,不是应该全都是0的嘛。

于是进行了更详细的单步跟踪,发现初始数据段中数据确实为0,但执行完mov ss,ax;mov sp,16这两条指令后,数据段中数据发生改变。这是为什么呢?



C:\DOCUME~1\SNUSER>debug jc10-5.exe

-u

0C50:0000 B84F0C        MOV     AX,0C4F

0C50:0003 8ED0          MOV     SS,AX

0C50:0005 BC1000        MOV     SP,0010

0C50:0008 8ED8          MOV     DS,AX

0C50:000A B80000        MOV     AX,0000

0C50:000D FF160E00      CALL    [000E]

0C50:0011 40            INC     AX

0C50:0012 40            INC     AX

0C50:0013 40            INC     AX

0C50:0014 B8004C        MOV     AX,4C00

0C50:0017 CD21          INT     21

-r

AX=0000  BX=0000  CX=0029  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000

DS=0C3F  ES=0C3F  SS=0C4F  CS=0C50  IP=0000   NV UP EI PL NZ NA PO NC

0C50:0000 B84F0C        MOV     AX,0C4F

-d 0c4f:0 f

0C4F:0000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

-t

AX=0C4F  BX=0000  CX=0029  DX=0000  SP=0000  BP=0000  SI=0000  DI=0000

DS=0C3F  ES=0C3F  SS=0C4F  CS=0C50  IP=0003   NV UP EI PL NZ NA PO NC

0C50:0003 8ED0          MOV     SS,AX

-d 0c4f:0 f

0C4F:0000  00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00   ................

-t

AX=0C4F  BX=0000  CX=0029  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000

DS=0C3F  ES=0C3F  SS=0C4F  CS=0C50  IP=0008   NV UP EI PL NZ NA PO NC

0C50:0008 8ED8          MOV     DS,AX

-d 0c4f:0 f

0C4F:0000  00 00 00 00 00 00 4F 0C-00 00 08 00 50 0C 5D 06   ......O.....P.].

-t

AX=0C4F  BX=0000  CX=0029  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000

DS=0C4F  ES=0C3F  SS=0C4F  CS=0C50  IP=000A   NV UP EI PL NZ NA PO NC

0C50:000A B80000        MOV     AX,0000

-d 0c4f:0 f

0C4F:0000  00 00 00 00 00 00 4F 0C-00 00 0A 00 50 0C 5D 06   ......O.....P.].

-t

AX=0000  BX=0000  CX=0029  DX=0000  SP=0010  BP=0000  SI=0000  DI=0000

DS=0C4F  ES=0C3F  SS=0C4F  CS=0C50  IP=000D   NV UP EI PL NZ NA PO NC

0C50:000D FF160E00      CALL    [000E]                           DS:000E=065D

-d 0c4f:0 f

0C4F:0000  00 00 00 00 00 00 00 00-00 00 0D 00 50 0C 5D 06   ............P.].
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2012-8-3 22:43:54 | 显示全部楼层
丶Haw 发表于 2012-8-3 22:05
检测点10.5

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

这题关键在于不能用t命令单步调试。因为ds段和ss段重合了,所以理论上call入栈后,ds:[0eh]=ss:[0eh]=ip=11h。
但是如果用t命令单步调试会产生中断,并且会向ss段压入临时的值,这时候ds:[0eh]就不等于11h了。
用g命令直接跳过就没事了。
10.5.png

以后学中断应该就知道了。
参考阅读:http://blog.csdn.net/wankong/article/details/1322703
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-8 06:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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