. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
主题 : :  终于弄懂试验8了,不懂的可以来看看  [待解决] 回复[ 5次 ]   点击[ 427次 ]  
sunm
[帖 主] [ 发表时间:2011-09-21 12:43 ] 
荣誉值: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个小时。终于解决了!
大家一起学习愉快
jx0101
[第2楼] [ 回复时间:2011-09-23 09:22 ] 
荣誉值:0
信誉值:0
注册日期:2011-09-21 11:06
谢谢楼主,我看了几个小时都没明白怎么回事,在你这里终于看的明白点了,关键的关键,程序不是复制的汇编语句过去,而是值(也就是机器码)明白了这点,一切都释然了
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved