一.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).
>>>>下面是个无条件转移指令综合范例:<<<<<<
/////////////////////////////////////////////////////////////////////
二. 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!!
下面写个有条件转移综合范例:
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
四. 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)下面用有关显示加法口决表综合用法;
好了就说到这里了 ,希望这些给你带来帮助,win32的汇编程序这个方面我以后再写。