. : : 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
online6883
[第83楼] [ 回复时间:2012-09-01 11:42 ] 
荣誉值:0
信誉值:0
注册日期:2012-04-07 22:11
胡说八道,第一楼根本没有仔细观察运行步骤!


运行mov cs:[di],ax时,就改写了s: nop的空指令(null)成EBF6。------------|
                                 nop                                   | 
请注意EBF6机器码在这里的意思是向上跳9位 ,绝对不是向上跳10位!           | 
                                                                       !
"s0:jmp short s"机器码指令是EBF9,在这里的意思是向上跳6位!回数正好在s:nop处!此时s的内存机器代码是EBF6,意思是向上跳6位后又向上跳9位!问题是再往上跳就出现转移位移出界,但编绎器没有警告就跳到mov ax,4c00h 为什么?
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved