. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  终于弄懂试验8了,不懂的可以来看看  [待解决] 回复[ 5次 ]   点击[ 424次 ]  
sunm
[帖 主]   [ 发表时间:2011-09-21 12:43 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-09-19 08:05
唉,看完试验8后,调试总跟自己想的结果不一样,想了快一个小时了,刚吃完饭回来,一看,居然想通了!
assume cs:codesg 
codesg segment 
        (5)     mov ax,4c00H 
             int 21H 
start:  
             mov ax,0 
s:     
     (4)        nop 
             nop 
             mov di,offset s 
             mov si,offset s2 
             mov ax,cs:[si] 
  (1)       mov cs:[di],ax 
s0: 
    (3)        jmp short s 
s1: 
            mov ax,0 
            int 21H 
            mov ax,0 
s2: 
     (2)       jmp short s1 
            nop 
codesg ends 
end start

注意我的标号啊,程序运行后的顺序执行!
(1) 是 将(2) 的值赋到(4),意思很明白,我就不说了!在这里我要说明的是程序不是将 jmp short s1复制过去,机器不懂这个语言,而是将它代表的机器码EBF6复制,重点在这里! 这个意思就是将IP的地址想前偏移10个字节。
(2)没有运行啊,我只是去标志作用,说明(1)将(2) 的内容copy了,但程序还没运行到此
  接着往下运行到(3),跳到s位置,意思很明确了!也就是我们即将运行(4)
(4) 此处的代码已经变化了,(原因是(1)的操作所致),此时此处的操作指令是EBF6,而不是jmp short s1,上面我已经说过,这个指令意思我也讲过, 就是说IP,所指向的位置跑到前面10个字节了
此时我们ip地址为08,执行玩这个指令后应该+2,变成10了(EBF6 两个字节),然后再-10,变成0了
变成我们代码段首地址了,也就是我们将运行(5)
后面我就不说了,你明白的!
OK,我要开始试验9了,纠结了1个小时。终于解决了!
大家一起学习愉快
chinatree
[第1楼]   [ 回复时间:2011-09-21 13:07 ]   [引用]   [回复]   [ top ] 
荣誉值:118
信誉值:0
注册日期:2011-07-07 22:59
悟性挺高的。
jx0101
[第2楼]   [ 回复时间:2011-09-23 09:22 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-09-21 11:06
谢谢楼主,我看了几个小时都没明白怎么回事,在你这里终于看的明白点了,关键的关键,程序不是复制的汇编语句过去,而是值(也就是机器码)明白了这点,一切都释然了
fomalhaut
[第3楼]   [ 回复时间:2011-11-05 16:34 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-03 19:04
assume cs:code
code segment 
                mov ah,4ch
                int 21h
                
start:  mov ax,0
                nop     ;add a nop here!!!!
        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
        
code ends
end start 

我的程序是这样的,加了一个nop才能有“Program terminated normally”的结果!!!
说实话…………
fomalhaut
[第4楼]   [ 回复时间:2011-11-05 16:39 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-03 19:04
啊,我知道错在哪里了!!
惭愧
mantuluo
[第5楼]   [ 回复时间:2011-11-22 19:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2011-11-15 22:48
这个实验挺简单的,我5分钟就想出来了,编译时最后向上偏移十个字节,执行时在向上偏移十个字节就得到EA=0
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved