c语言编写程序循环指令,汇编编程笔记--转移与循环指令

本文详细介绍了汇编语言中的无条件跳转指令jmp、比较指令cmp及其配合的条件跳转指令如j...,以及循环指令loop、loope/loopz和loopne/loopnz。通过实例解析了各指令的格式、作用和使用场景,并强调了它们在程序流程控制中的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.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).

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

4d9b888be2df92edab03417031349f8f.png

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

二.      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!!

下面写个有条件转移综合范例:

bc35a785c70138db78b9e88929e7e343.png

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

四. 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)下面用有关显示加法口决表综合用法;

0acac088b44d2e43ea61571d024e623e.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值