. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  实验8程序分析  [待解决] 回复[ 92次 ]   点击[ 5082次 ]  
newasmer
[帖 主] [ 发表时间:2007-06-27 15:11 ] 
荣誉值:0
信誉值:0
注册日期:2007-06-26 14:20
实验8程序分析
assume cs:codesg
codesg segment
             mov ax,4c00H
             int 21H
start: 
             mov ax,0
s:    
             nop
             nop
             mov di,offset s
             mov si,offset s2
             mov ax,cs:[si]
             mov cs:[di],ax
s0:
            jmp short s
s1:
            mov ax,0
            int 21H
            mov ax,0
s2:
            jmp short s1
            nop
codesg ends
end start
执行流程:
程序从start处 mov ax,0开始执行,执行到mov cs:[di],ax,就把s2:处jmp short s1拷贝到s处,即覆盖2个nop(正好2个字节)
jmp short s1 在s2处,可以计算一下需要往上编译10个字节(3(jmp short s1)+3*2(mov ax,0)+2(int 21H)),
debug可以看到机器码为ebf6,f6是补码,转换一下即10,也即是向上偏移10个字节,这样的话s:处的2个nop的代码修改成
ebf6。
程序接着往下运行,跑到s0:jmp short s,这样又s:处,执行EBF6,即往上偏移10字节,计算一下就知道,ip这个时候指向0,
跑到codesg段开始处,即执行mov ax,4c00H;int 21H
ldlihuanfa
[第41楼] [ 回复时间:2010-01-12 14:53 ] 
荣誉值:6
信誉值:0
注册日期:2009-12-18 19:53
学习呀,自己仔细看了一下,开始也不懂,新手就是新手啊,终于明白道道了
-u
0B62:0005 B80000        MOV     AX,0000
0B62:0008 90            NOP
0B62:0009 90            NOP
0B62:000A BF0800        MOV     DI,0008
0B62:000D BE2000        MOV     SI,0020
0B62:0010 2E            CS:
0B62:0011 8B04          MOV     AX,[SI]
0B62:0013 2E            CS:
0B62:0014 8905          MOV     [DI],AX
0B62:0016 EBF0          JMP     0008
0B62:0018 B80000        MOV     AX,0000
0B62:001B CD21          INT     21
0B62:001D B80000        MOV     AX,0000
0B62:0020 EBF6          JMP     0018
0B62:0022 90            NOP
0B62:0023 54            PUSH    SP
0B62:0024 0C2B          OR      AL,2B


其实就是0020h和0018h之间的位移,20h就是32,18h就是24,位移为8 按书上计算应该是10,加上两个字节
从理解上来说,从具体位置上理解为8也行,
然后跳转到0008,执行,向前移8位变为0000
哎。。笨啊。。


-g 0010
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved