. : : Assembly Language : : .  |  首页  |  我提出的问题  |  我参与的问题  |  我的收藏  |  消息中心   |  游客  登录  | 
刷新 | 提问 | 未解决 | 已解决 | 精华区 | 搜索 |
  《汇编语言》论坛 ->转移指令的原理
  管理员: assembly   [回复本贴] [收藏本贴] [管理本贴] [关闭窗口]
主题 : :  第九章的笔记,分享一下供大家学习,有疏漏之处,请谅解.  [待解决] 回复[ 1次 ]   点击[ 224次 ]  
xueyugaoyuan
[帖 主]   [ 发表时间:2012-08-20 20:06 ]   [引用]   [回复]   [ top ] 
荣誉值:0
信誉值:0
注册日期:2012-08-14 17:57
--------------------------------转移指令的原理---------------------
1.操作符:offset   
2.jmp指令
3.依据位移进行转移的jmp指令
  jmp short 标号
  jmp near ptr 标号
4.转移的目的地址在指令中的jmp指令
  jmp far ptr 标号
5.转移地址在寄存器中的jmp指令
  jmp 16为reg
6.转移地址在内存中的jmp指令
  jmp word ptr 内存单元地址(段内转移)
  jmp dword ptr 内存单元地址(段间转移)
7.jcxz指令
8.loop指令

1.-----操作符offset--------------
assume cs:code
code segment
    start:mov ax,offset start ;相当于mov ax,0
             s:mov ax,offset s    ;相当于mov ax,3
code ends
end start
------------------------------------------------------------------
assume cs:code         ;添加两条指令,使该程序在运行中将s处的一条指令复制到s0处。
code segment
     s:mov ax,bx
           mov si,offset s
           mov di,offset s0
           mov ax,cs:[si]   ;--1--
           mov cs:[di],ax   ;--2--
        s0:nop
           nop
code ends
end s
-------------------------------------------------------------------
jmp指令为无条件转移指令,可以只修改ip,也可同时修改cs和ip。
jmp指令要给出的两种信息:
 1.转移的目的地址
 2.转移的距离(段间转移,段内短转移,段内近转移)
下面的几节内容,以给出目的地址的不同方法为主线,讲解jmp指令的主要
应用格式和cpu执行转移指令的基本原理。
--------------------------------------------------------------------
111111111111111111111111111111111111111111111111111111111111111111111
---------------------依据位移进行转移的jmp指令---------------------
------jmp short 标号  ;(转到标号处执行指令)指令实现的是段内短转移,
对ip的修改范围是:-128~127 ,shor符号说明指令进行的是短转移,标号
指明了要转移的目的地,转移指令结束后,cs:ip应该指向标号处的指令。
--------------------------------------------------------------------
assume cs:code
code segment
start:mov ax,0
     jmp short s
     add ax,1
     s:inc ax
code ends
end start
------------------------------------------------------------------------
注意:jmp short 标号 所对应的机器码为EB03,这个机器码中竟不包含转移的目的地址。
     说明:cpu在执行jmp指令的时候并不需要转移的目的地址。cpu在执行EB03的时候是根据什么修改的ip
          使其指向目标指令呢!?就是根据指令码中的03.
          指令EB03并没有告诉cpu要转移的目的地址,可告诉了cpu要转移的位移。
”jmp short 标号“的功能是;(ip)=(ip)+8位位移
 1.8为位移=标号处的地址-jmp指令后的第一个字节的地址
 2.short指明了此处的位移为8为位移
 3.8为位移的范围为:-128~127,用补码表示
 4.8为位移由编译程序在编译时算出。
jmp near ptr 标号  ; 实现段内近转移、
”jmp near ptr 标号“的功能是;(ip)=(ip)+16位位移
 1.16为位移=标号处的地址-jmp指令后的第一个字节的地址
 2.near ptr 指明了此处的位移为16位
 3.16为位移的范围为:-32768~32767 用补码表示
 4.16为位移由编译程序在编译时算出。
  -------------------转移的目的地址在指令中的jmp指令--------------------
前面讲的jmp指令,其对应的指令中并没有转移的目的地址,而是相对于当前ip的转移位移,
“jmp far ptr 标号”实现的是段间转移,也称为远转移。
功能如下:(cs)=标号所在段的段地址;(ip)=标号在段中的偏移地址。
assume cs:code
code segment
     start:mov ax,0
               mov bx,0
                   jmp far ptr s
                   db 256 dup (0)
                 s:add ax,1
                   inc ax
code ends
end start 
-u
0BBD:0006 EA0B01BD0B  JMP 0BBD:010B
注意:jmp far ptr s所对应的机器码:EA0B01BD0B,其中包含转移的目的地址。
     “B01BD0B”是目的地址在指令中的存储顺序。
         高地址的“BD0B"是转移的段地址:0BBDH。
         低地址的”0BO1"是转移地址:010BH
-----------------------------------------------------------------------
---------转移地址在寄存器中的jmp指令---------------------------------
指令格式:jmp 16位reg
指令功能:(ip)=(6位reg)
;mov指令不能用于设置cs,ip的值。因为:8086cpu没有提供这样的功能。
1.若想同时修改cs,ip的内容。可用形如:jmp 段地址:偏移地址 的指令完成
  指令的功能:用指令中给出的段地址修改cs,偏移地址修改ip。
  jmp 2ae3:3 执行后:cs=2ae3h。ip=0003h,cpu将从2ae33h处读取指令。
  此指令是在debug中使用的汇编指令,汇编编译器并不认识。如果在源程序中使用,编译时也会报错。
2.若想仅修改ip的内容,可用形如:jmp 某一合法的寄存器 的指令完成。
  指令功能:用寄存器中的值修改ip。如:
  jmp ax  指令执行前:ax=1000h,cs=2000h,ip=0003h
          指令执行后:ax=1000h,cs=2000h,ip=1000h
-------------------------------------------------------------------------------------
-----------------------转移地址在内存中的jmp指令------------------------------------
转移地址在内存中的jmp指令有两种格式:
1.jmp word ptr 内存单元地址(段内转移)
  功能:从内存单元地址处开始存放着一个字,是转移的目的偏移地址。
        (ip)=(内存单元地址)
2.jmp dword ptr 内存单元地址(段间转移)
  功能:从内存单元地址处开始存放着两个字,高地址处的字是转移的目的段地址,
        低地址处的字是转移的目的偏移地址。
                (cs)=(内存单元地址+2)
            (ip)=(内存单元地址)
----------------------------有条件转移指令------jcxz指令-------------------------------
所以的有条件转移指令都是短转移。在对应的机器码中包含转移的位移,而不是目的地址,对ip的修改范围都为:-128~127 。
 指令格式:jcxz 标号(如果(cx)=0,转移到标号处执行)
     操作:当(cx)=0时,(ip)=(ip)+8位位移 
               当(cx)不等于零时,什么也不做(程序向下执行)
8位位移=标号处的地址-jcxz指令后的第一个字节的地址
8位位移的范围为:-128~127,用补码表示
8位位移有编译程序在编译时算出。
jcxz 标号  的功能相当于:
if((cx)==0)
   jmp short 标号:
----------------------------------------------------------------------------------------
-----------------------loop指令---------------------------------------------------------
loop指令为循环指令,所以的循环指令都是短转移,在对应的机器码中包含转移的位移,而不是目的地址,
对ip的修改范围都为:-128~127.
指令格式:loop 标号 ((cx)=(cx)-1,如果(cx)不等于零,转移到标号处执行。)
操作:1.(cx)=(cx)-1
      2.如果(cx)不等于零,(ip)=(ip)+8为位移
            如果(cx)=0,什么也不再(程序向下执行)
8位位移=标号处的地址-loop指令后的第一个字节的地址
8位位移的范围:-128~127,用补码表示
8为位移有编译程序在编译时算出。
----------------------------------------------------------------------------------------
fpamc
[第1楼]   [ 回复时间:2012-08-21 06:41 ]   [引用]   [回复]   [ top ] 
荣誉值:30
信誉值:4
注册日期:2012-01-01 16:36
做笔记是个好习惯。。
需要登录后才能回帖 -->> 请单击此处登录
    Copyright © 2006-2024   ASMEDU.NET  All Rights Reserved