汇编编程笔记--转移与循环指令

一.jmp指令

  (1)指令格式: jmp 标记名称

  (2指令意义: 无条件转移指令,类似c语言goto指令,执行此指令时,先将标记名称所在的地址入到指令寄存器(ip)内,程序就执行ip所指之处的指令.

 (3)指令执行后,根据结果可能变动的标记: jmp指令并不影响任何标记.
>>>>> 注:
1.标记名称(traget)的命名,不可以用保留字.
2.标记名称所在地址,可以依据程序流程的需要可以放在任何地方,也即转移指令可以往前移,
  可以往后移.
3.依据所转移的距离(所谓距离是指界于jmp至标记名所有指令的机器码的总和),本指令
  在汇编时,可以三类机器码如下:
  A>Shor:往前移动128个byte机器码或往后移动超过127个byte机器码,属于短距离的转移.
  B>Near:往前移动128个byte机器码或往后移动127个byte机器码,属于短距离的转移.
  C>Far: 标记所在地址与jmp指令不属于同一程序段(即一个在主程序,另一个在子程序),
         这个是长距离转移,汇编时被汇编成5个byte长度的机器码,第一个byte为ea,
         第四个和第五个byte为标记所在的地址,第二个和第三个byte为相对于段地址的
         偏移值(offset).

>>>>下面是个无条件转移指令综合范例:<<<<<<

汇编编程笔记--转移与循环指令_第1张图片

/////////////////////////////////////////////////////////////////////

二.      CMP指令
(1)指令格式: cmp 想比较的对象,跟谁比(根据内容)
 (2) 指令意义: compare,比较指令,将所指定的对象与想比较的内容相减,依据
               相减后的结果来设定标记值,参与相减的二个运算元素,内容并
               不会改变.
下面用例子说明:
     1) CMP AL,25
     2) CMP CX,BX
     3) CMP CH,BYTE PTR MSG1
     4) CMP ES,WORD PTR MSG2,AX
1)所谓指定的对象可以是8bit或16bit寄存器或内存变量,但比较的变量长度必须
  相等(不可用8bit与16bit相比或16bit与8bit相比).
2)想比较的内容,可用寄存器或内存变量还可以用立即值.
3)比较的对方不可同时用内存变量,且系统默认内存变量所在的地址为数据段(ds),
  因此如果内存变量不在数据段时可用强置型.
4)比较指令的执行可用如下面的演算来说明:
    MOV AL,65H     ->AL=01100101
    MOV BL,0A5H    ->BL=10100101;二式相减
    CMP AL,BL      ->   11000000;相减结果
  比较的相减是所指定的对象为被减数,想比较的内容为减数,相减后二者内容都不
  变,仅就相减的结果来设定标记,因此上述执行的结果标记的内容为cf=1,pf=1,
  af=0,zf=0,sf=1,of=1.

/////////////////////////////////////////////////////////////////////////

三.      J...指令
(1)指令格式: j... 标记名(短距离short)
(2)指令意义: jump if...:有条件转移指令.根据接于j后面的条件是否与标记值
   相符,用以决定转移是否发生,也即条件相符则移至标记所在地址执行,条件不
   符继续执行下一个指令.
(3)j后面条件详表如下:
=================================================================
   JA- 若大于则转移(不带符号).    JAE- 若大于等与则转移(不带符号).  
   JB- 若小于则转移(不带符号).    JBE- 若小于等与则转移(不带符号).  
   JC- 若进位则转移(不带符号).    JCXZ-若cx寄存器为0则转移.  
   JE- 若相等则转移.
   JG- 若大于则转移(带符号).      JGE-若大于等与则转移(带符号).
   JL- 若小于则转移(带符号).      JLE-若小于等与则转移(带符号).   
   JNA-若不大于则转移(不带符号).  JNAE-若不大于等与则转移(不带符号).
   JNB-若不小于等与则转移(不带符号). JNBE-若不小于则转移(不带符号).  
   JNC-若没有进位则转移.          JNE-若不相等则转移.
   JNG-若不大于则转移(带符号).    JNGE-若不大于等与则转移(带符号).
   JNL-若不小于则转移(带符号).    JNLE-若不小于等与则转移(带符号).   
   JNO-若没有溢位则转移.          JNP-若没有奇偶位(奇数个1)则转移.         
   JNS-若为正数则转移.           JNZ-若不为0则转移.
   JO-若溢位则转移.              JP-若有奇偶位(奇数个1)则转移.
   JPE-若有奇位则转移.           JPO-若有偶位则转移.
   JS-若为负数则转移.            JZ-若为0则转移.
====================================================================
说明:
    在高级语言中所用的关系运算式,其概念(二数比较大小后的大于'小于...等)也
可以用于汇编语言,只不过使用上二者稍有不同,高级语言是一气呵成,(c中-if(xxx))
一行指令解决,汇编语言不同必须考虑下面二件事;
a.-为参与运算的二数其正负问题.
b.-为运算后二数是否容许改变,因此考虑不同使用的指令也就不同,而二数想产生大于,
 小于...的关系,只有将二数相减然后根据结果才判断,因此汇编语言的条件转移指令(
 (关系运算者))一般是与cmp或sub指令配对使用.
  注意.数值不容许被改变时用cmp,反之则用sub!!
下面写个有条件转移综合范例:

汇编编程笔记--转移与循环指令_第2张图片

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

四. LOOP指令
(1)指令格式: LOOP 标记名(短距离short)
(2)指令意义: 循环指令,执行循环前先将想执行的次数放到cx寄存器内每执行循环
            一次,内容自动减1,一直到cx的内容为0时才结束循环.
(3)如下:
   MOV CX,25
Lab1:   :< ------
        :       |
        :       |
     LOOP LAB1<--    
1.标记名称(traget)的命名,不可以用保留字.
2.标记名称所在位置一定要在loop指令之前(既只能往前移动),且从标记到loop指令
  遵守执行机器码长度不可以超过128个byte(短距离short 转移);
3.计数值是放在cx寄存器内,因cx是16bit的,因此循环最多可执行65535次数(如果
  cx的初值是0,则可以执行65536次.
4.从指令格式可知,循环内的指令最少把执行一次,且计数的初值必须在循环之外.
5.指令和c语言的for(x;x;x)有点相似,只是c是初值和终值,step三个来控制执
  行次数,这里loop每次递减1当然也可以改变cx的指令来改变循环次数的控制.
  还有在设计环形循环必须与push,pop指令一起使用,避免计数值出现错误.
/////////////////////////////////////////////////////////////////
五:     LOOPE/LOOPZ指令
(1)指令格式: LOOPE/LOOPZ 标记名(短距离short)
(2)指令意义: LOOP if Equal或LOOP if zero有条件循环指令(必须配合cmp使用!),
   将想执行循环的次数放到cx寄存器内,而每执行循环一次,cx内容自动减1,并比较
所指定的二数是否相等,如果cx不为0,且二数是相等,则继续执行循环,若cx=0或者二
数是不相等,则结束循环的执行.
(3)如下:

       MOV CX,25
Lab1:   :< ------
        :        |
        :        |
       CMP AL,50 |
     LOOPE LAB1<--
4)和c语言中的do...while用法相似.
/////////////////////////////////////////////////////////////////
五:     LOOPNE/LOOPNZ指令   
(1)指令格式: LOOPNE/LOOPNZ 标记名(短距离short)
(2)指令意义: LOOP if No Equal或LOOP if No zero有条件循环指令(必须配合
   cmp使用!),将想执行循环的次数放到cx寄存器内,而每执行循环一次,cx内容自
   动减1,并比较所指定的二数是否相等,如果cx不为0,且二数是不相等,则继续执
   行循环,若cx=0或者二数是相等,则结束循环的执行.
(3)如下:

       MOV CX,25
Lab1:   :< ------
        :        |
        :        |
       CMP AL,50 |
     LOOPNE LAB1<--    
(4)下面用有关显示加法口决表综合用法;

汇编编程笔记--转移与循环指令_第3张图片

好了就说到这里了 ,希望这些给你带来帮助,win32的汇编程序这个方面我以后再写。

你可能感兴趣的:(汇编编程笔记--转移与循环指令)