搜档网
当前位置:搜档网 › 控制转移类指令

控制转移类指令

控制转移类指令
控制转移类指令

控制转移类指令

?用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令.

?控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变

说明

?只有中断返回指令(IRET)改变控制标志位

?许多转移指令受状态标志位的影响

1.无条件转移指令(JMP 操作数;程序转向label标号指定的地址)

◆寻址方式:

直接寻址方式

转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式

间接寻址方式

转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式

◆目标地址范围

?段内(注意转移范围是+ -,即前后都可以转移!当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负)

?段内转移——近转移(near)

?转移范围用二个字节表达,在当前代码段64KB范围内转移(±32KB范围)

?不需要更改CS段地址,只要改变IP偏移地址,由16位带符号数给出。

?段内转移——短转移(short)

?转移范围用一个字节表达,在当前代码段256B范围内转移(-128~+127范围),

只改变IP的值,由8位带符号数给出。

?段间

段间转移——远转移(far)

从当前代码段跳转到另一个代码段,可以在1MB范围

需要更改CS段地址和IP偏移地址

目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址。段间间接转移指令中,目的地址存放在连续4个存储单元字节中,低字节两个单元的内容代替IP,高字节两个单元的内容代替CS。

注:实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、near ptr或far ptr强制.

?思考:

如果转移超过16BIT,怎么办?

答:变成段间转移。

JMP 1234H 这个指令对否?JMP 12345678H呢?

2、条件转移指令(Jcclable;条件满足,发生转移:IP←IP+8位位移量;条件不满足,顺序执行)

注意:1.Jcc本身不是一条指令,它是条件转移指令的统称。

2.操作数label是采用短转移,条件转移只能是短转移。

3.8位位移量是相对于当前IP的,相对寻址方式。

4.Jcc指令为2个字节,条件不满足时的顺序执行,就是当前指令偏移指针IP加。

5.不影响标志,但要利用标。

16条指令分成4种情况:

⑴判断单个标志位状态

⑵比较无符号数高低

⑶比较有符号数大小

⑷判断计数器CX 为0

指令应用示例:

例1.计算|X -Y|(绝对值)

;X 和Y 为存放于X 单元和Y 单元的16位操作数

;结果存入result

movax,X

subax,Y

jnsno_neg neg ax ;neg 是求补指令

No_neg: movresult,ax

例2.设字符的ASCII 码在AL 寄存器中,在字符ASCII 码中为“1”的个数已为奇数时,则令其最高位为“0”;否则令最高位为“1”。

and al,7fh ;最高位置“0”,同时判断“1”的个数 jnp next

;个数已为奇数,则转向next

or al,80h ;否则,最高位置“1”

next: ...

例3.记录BX 中1的个数

方法一:xoral,al ;AL =0,CF =0

again: test bx,0ffffh ;等价于

cmp bx,0

jz next ; ZF=1,去next

shl bx,1

jnc again

inc al

jmp again

next: ... ;AL保存1的个数

方法二:xoral,al ;AL=0,CF=0

again: cmp bx,0

jz next

shl bx,1 ;也可使用shr bx,1 Array adc al,0

jmp again

next: ... ;AL保存1的个数

例4.无符号数比较高低

补充知识:

无符号数的大小用高(Above)低(Below)表示

利用CF确定高低、利用ZF标志确定相等(Equal)

两数的高低分成4种关系:

⑴低于(不高于等于):JB(JNAE)

⑵不低于(高于等于):JNB(JAE)

⑶低于等于(不高于):JBE(JNA)

⑷不低于等于(高于):JNBE(JA )

比较之前一定要做可以改变标志位的减法,才能通过标志位来确定两数的高低大小关系。

比较两数大小,并将较大的数保存在AX里。

cmpax,bx ;比较ax和bx

jnb next ;若ax≥bx,转移

xchgax,bx ;若ax<bx,交换

next: ...

例5.比较有符号数大小

有符号数的大(Greater)小(Less)需要组合OF、SF标志,并利用ZF标志确定相等(Equal)

两数的大小分成4种关系:

⑴小于(不大于等于):JL(JNGE)

⑵不小于(大于等于):JNL(JGE)

⑶小于等于(不大于):JLE(JNG)

⑷不小于等于(大于):JNLE(JG )

尝试将例4程序段改成有符号数比较大小。

答:即把JNB改成JNL.

3.循环指令(loop)

LOOP label ;CX←CX-1,

;CX≠0,循环到标号label, CX=0,顺序执行

LOOPZ label ;CX←CX-1,

;CX ≠0且ZF =1,循环到标号label ,CX=0,顺序执行

LOOPNZ label ;CX ←CX -1,

;CX ≠0且ZF =0,循环到标号label ,CX=0,顺序执行

注意:

1、循环指令利用CX 计数器自动减1,方便实现计数循环的程序结构。

2、label 操作数采用相对寻址方式。

? 示例:

记录空格个数

movcx,count ;设置循环次数

movsi,offset string

xorbx,bx ;bx 清0,用于记录空格数

mov al,20h

again: cmpal,es:[si]

jnz next ;ZF=0,非空格,转移

incbx ;ZF=1,是空格,个数加1

next: incsi loop again ;字符个数减1,不为0继续循环

4.子程序指令

子程序是完成特定功能的一段程序,当主程序(调用程序)需要执行这个功能时,采用CALL 调用指令转移到该子程序的起始处执行,当运行完子程序功能后,采用RET 返回指令回到主程序继续执行。

CALL 指令分成4种类型(类似JMP )

CALL label ;段内调用、直接寻址

CALL r16/m16 ;段内调用、间接寻址

CALL far ptr label ;段间调用、直接寻址

CALL far ptrmem ;段间调用、间接寻址

注意:CALL 指令需要保存返回地址:

段内调用——入栈偏移地址IP

SP ←SP -2,SS:[SP]←IP

段间调用——入栈偏移地址IP 和段地址CS (先保护CS ,再保护IP )

SP ←SP -2,SS:[SP]←CS

SP ←SP -2,SS:[SP]←IP

RET 指令根据段内和段间、有无参数,分成4种类型

RET ;无参数段内返回

RET i16 ;有参数段内返回

RET ;无参数段间返回

RET i16 ;有参数段间返回

需要弹出CALL 指令压入堆栈的返回地址

段内返回——出栈偏移地址IP

IP ←SS:[SP], SP ←SP +2

段间返回——出栈偏移地址IP 和段地址CS (先返回IP ,再返回CS )

IP ←SS:[SP],SP ←SP +

2

CS←SS:[SP],SP←SP+2

5、中断指令

中断的指令有3条:

INT i8 IRET INTO

本节主要掌握类似子程序调用指令的中断调用指令INT i8,进而学习使用DOS功能调用INT i8

;中断调用指令:产生i8号中断

IRET

;中断返回指令:实现中断返回

INTO

;溢出中断指令:

;若溢出标志OF=1,产生4号中断

;否则顺序执行

6、处理机控制类指令

只需记住CL+标志位首字母是复位,ST+标志位首字母是置位就足够了。

汇编实验五条件转移指令

汇编实验五条件转移指令

————————————————————————————————作者:————————————————————————————————日期: 1

实 验 报 告 ── 学年 第 学期 实 验 课 程 汇编语言 学 生 姓 名 123 实 验 项 目 条件转移指令 学 院 计算机科学技术 实 验 性 质 专业选修课 班 级 学 号 实 验 地 点 同 组 人 数 1 第 组 实 验 日 期 第周 星期 第 节 成 绩 5 环 境 参 数 Dosbox-0.74 Masm 5.0 一、实验目的及要求 二、实验原理、实验内容 三、实验仪器设备及材料 四、操作方法与实验步骤 五、实验数据记录及处理 六、实验结果分析及讨论 一、实验目的: 1.8088指令:JZ,JNZ,JC,JNC,CMP,SHR 。 2.程序:用字符搜索法确定字符串长度。 3.程序:16进制数化为ASCII 码的一般方法。 二:实验任务 1.自编程序:修改实验准备程序(二),使除了以16进制数形式显示内存内容外,还能在其右边显示该16进制码所对应的ASCII 字符,07-0D 的控制字符用'.'代替。 源代码:

DATA SEGMENT DATA ENDS STACKS SEGMENT STACK STACKS ENDS CODE SEGMENT 'code' ASSUME CS:CODE,DS:DATA,SS:STACKS START: MOV AX,DATA MOV DS,AX MOV SI,0H MOV BL,10H LOP:MOV DL,[SI] ;先处理高四位 MOV CL,4H SHR DL,CL ;右移四位 CMP DL,0AH ;判断是‘0’-‘9’还是‘a'-’f‘ JC J1 ;是0-9 跳转 ADD DL,7H ;是a-f 要多加7 因为‘9’为 390h ‘A' 为41h 相差7h J1: ADD DL,30H ;以'0'为基址 MOV AH,2H ;输出高四位的ASCII码 INT 21H MOV DL,[SI] ;处理第四位 AND DL,0FH CMP DL,0AH ;同上

逻辑及布尔指令和控制转移类指令练习

逻辑及布尔指令和控制转移类指令练习 实验名称: 逻辑及布尔指令和控制转移类指令练习实验目的:1. 熟悉掌握逻 辑及布尔和控制转移指令的功能及编程;2. 熟悉单片机接口中各位信号的逻辑 操作3. 掌握字节数据的拼接、转换及组合。实验要求:按照实验安排准时参 加实验,按照实验步骤操作,仔细观察及记录实验过程及结果,回答实验相关 问题,最终根据实验结果撰写实验指导书。实验内容:1、从教材上任意选择一 程序,将之输入,练习程序调试的基本方法,体会STEP INTO,STEP OVER,运行到光标处,全部运行,设置断点,清除断点,等等基本的调试方 法。2、将教材中关于逻辑操作与控制转移指令分别逐条进行实验,注意体会 指令语法要求以及所执行的操作。3、30H,31H 单元用非压缩BCD 码表示两 位的十进制数,将其转换成十进制数存入32H 单元;将其转换成十六进制数存 入33H 单元。(30H 为高位,31H 为低位)实验过程:1. 熟悉MOV 指令,在KEIL 软件里建立新工程并输入:ORG 0MOV A.#00110000BMOV B.#7FHMOV SP.#07HMOV DPTR.#010FHMOV R0.#A2HMOV A.@R0MOV B.@DPHMOV A.@DPLEND2. 分步运行,观察寄存器A,B,DPTR,堆栈指针SP 和程序计数器PC 的值。3. 30H,31H 单元用非压缩BCD 码表示两位的十进制数,将其转换成十进制数存入32H 单元;将其转换成十六进制数存入33H 单元。(30H 为高位,31H 为低位)输入:ORG 0MOV 30H,#00001000BMOV 31H,#00001001B;用非压缩的BCD 码在30H 和31H 里表示89DMOV A,30HRRC ARRC ARRC ARRC AMOV R2,30HADDC A,R2DA AMOV 33H,AENDtips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

关于第十讲控制转移类指令

第九讲控制转移类指令 教学方法: 讲授法 教学目的: 1、了解控制转移类指令的种类 2、掌握无条件转移指令的特点及应用 3、掌握调用指令的特点及应用 教学重点、难点: 各类指令操作功能循环、移位指令 条件转移指令的特点及应用 主要教学内容(提纲): 一、控制转移类指令的种类 二、无条件转移指令的特点及应用 三、调用指令的特点及应用 复习:逻辑操作指令,单字节:CLR,CPL,RL,RLC,RR,RRC 双字节:ANL,ORL,XRL。 讲授要点 §3-5 控制转移类指令 作用:改变程序计数器PC的值,从而改变程序执行方向。 分为四大类:无条件转移指令;条件转移指令;调用指令;返回指令。 一、无条件转移指令 LJMP addr16 AJMP addr11 SJMP rel JMP @A + DPTR LJMP addr16 ;长跳转 转移目的地址addr16 (PC);0000H ~ FFFFH,64KB AJMP addr11 ;绝对转移 转移目的地址的形成:先(PC)(PC)+ 2; 后PC15 ~ 11不变,PC10 ~ 0 addr10 ~ 0 64KB = 216 =25×211 = 32×2KB 转移目的地址与(PC)+ 2在同一个2KB范围内。

SJMP rel ;短转移,相对寻址。 转移目的地址= (PC)+ 2 + rel, 所以rel = 转移目的地址-(PC)-2 但,实际使用中常写成SJMP addr16,汇编时会自动转换出rel。 JMP @A + DPTR ;间接转移,散转移指令。 转移目的地址= (@A)+ (DPTR) 本指令不影响标志位,不改变@ A 及DPTR中的内容。常用于多分支程序结构中,可在程序运行过程中动态地决定程序分支走向。 例1、设A中为键值,试编写按键值处理相应事件的程序段。 解:MOV DPTR,#KYEG MOV B,#03H MUL AB JMP @A + DPTR · KYEG:LJMP KYEG0 LJMP KYEG1 · 画图比较LJMP、AJMP、SJMP、JMP转移的起点和范围。 二、调用指令 LCALL addr16 ;长调用 ACALL addr11 ;绝对调用 LCALL addr16 ;转移范围64KB,不影响标志位。执行中自动完成如下过程:(PC)(PC)+ 3 (SP)(SP)+ 1 ((SP))(PC7 ~ 0),保护断点地址低字节; (SP)(SP)+ 2 ((SP))(PC15 ~ 8),保存断点地址高字节; (PC)addr16 ,目的地址送PC,转子程序。 例2、设(SP)= 07H,(PC)= 2100H,子程序首地址为3456H,执行: LCALL 3456H MOV A,20H ······ 画出执行过程示意图。 执行结果:(SP)= 09H,(09H)= 21H,(08H)= 03H,(PC)= 3456H

第11讲 控制转移类指令(二)教案

第十一讲控制转移类指令 二、条件转移指令 实现按照一定条件决定转移的方向。分三类。 1、判零转移 JZ rel JNZ rel JZ rel ;若(A)= 0 ,则转移,否则顺序执行。 JNZ rel ;若(A)≠0,则转移,否则顺序执行。 转移目的地址= (PC)+ 2 + rel 不影响任何标志位。 例1、将外RAM的一个数据块(首地址为DATA1)传送到内部数据RAM(首地址为DATA2),遇到传送的数据为零时停止传送,试编程。 解:MOV R0,#DATA2 MOV DPTR,#DATA1 LOOP1:MOVX A,@DPTR JZ LOOP2 MOV @R0,A INC R0 INC DPTR SJMP LOOP1 LOOP2:SJMP LOOP2 2、比较转移指令 功能:比较二个字节中的值,若不等,则转移。 CINE A,#data,rel CJNE A,direct,rel CJNE @Ri,#data,rel CJNE Rn,#data,rel 该类指令具有比较和判断双重功能,比较的本质是做减法运算,用第一操作数内容减去第二操作数内容,但差值不回存。 转移目的地址= (PC)+ 3 + rel

若第一操作数内容小于第二操作数内容,则(C)= 1,否则(C)= 0。 该类指令可产生三分支程序: 即,相等分支;大于分支;小于分支。 例2、设P1口的P1.0 ~ P1.3为准备就绪信号输入端,当该四位为全1时,说明各项工作已准备好,单片机可顺序执行,否则,循环等待。 解:MOV A,P1 ANL A,#0FH CJNE A,#0FH,WAIT ;P1.0 ~ P1.3不为全1时,返回WAIT MOV A,R2 ······ 3、循环转移指令 DJNZ Rn,rel ;(二字节指令) DINZ direct,rel ;(三字节指令) 本指令也为双功能指令,即减1操作和判断转移操作。 第一操作数内容减1后,若差值不为零,则转移;否则顺序执行。 转移目的地址= (PC)+ 2或3 + rel 例3、将8031内部RAM的40H ~ 4FH单元置初值#A0H ~ #AFH。 解:MOV R0,#40H MOV R2,#10H MOV A,#0A0H LOOP:MOV @R0,A INC R0 INC A DJNZ R2,LOOP ······ 小结:1、无条件转移指令共有几条? 2、CJNE指令与DJNZ指令有何区别?

设计一条条件转移指令

实验报告 实验人:赵汝鹏学号: 09381052 日期: 2010-12-15 院(系):计算机科学系专业(班级):网络工程 实验题目:设计一条条件转移指令 一.实验目的 1.了解和掌握微程序控制器的组成和工作原理; 2.进一步了解和掌握计算机各部分的组成及相互关系; 3.了解微指令的执行过程,掌握微程序的设计方法,理解动态微程序设计的概念; 4.进一步认识和掌握计算机各指令的执行过程,搞清楚计算机的运行原理。 二.实验内容 设计一条指令,实现的功能是: 当DR=SR时,则原PC(IP)+OFFSET->PC; 当DRPC。 否则执行下条汇编指令。(注:OFFSET为位移量;ADDR为某内存单元地址) 三.实验器材 TEC-2实验计算机、电脑各一台 四.实验分析与设计 (2)指令功能 功能:设计一条指令,实现的功能是: 当DR=SR时,则原PC(IP)+OFFSET->PC; 当DRPC。 否则执行下条汇编指令。(注:OFFSET为位移量;ADDR为某内存单元地址) (3)设计分析 由于要根据DR与SR运算结果进行跳转,所以在110先让DR-SR产生DR与SR 的信息在状态寄存器。在111这里如果Z=1,则跳转至114进行下一步操作,否则 继续执行下一条;在112这里如果S=1,则转115进行下一步操作,否则执行下一 条。如果111与112都没有跳转,证明DR-SR>0,则让PC等于下一条指令的地址。 操作码选择DB,因为如此IR8-10位是011,CC非的值等于S非的值。

(4) 微程序 110:DR-SR 0000 0E01 9110 0088 111:PC->AR, 如果DR=SR转114 0045 0370 9030 5002 112:PC+1->AR,如果DRPC,转4A 0029 0300 B030 5400 114:IP+OFFSET->PC 0029 0300 30D6 5000 115:ADDR->PC 0029 0300 30F0 5000 (5) 加载到微控存程序段 A800 800:MOV R1, 900 802:MOV R2, 6 804:MOV R3, 110 806:LDMC 807:RET 808: G800 (6) 运行程序段 A820 820:MOV R7, 7 822:MOV R8, 8 824:MOV R9, 0 826:NOP 827:NOP 828:NOP 829:MOV R9, 1 82B:RET 82C:MOV R9, 2 82E:RET 82F:MOV R9, 3 831:RET 832: E826 DB78 0006 082F G820 第一种情况是DRSR

控制转移类指令分析

控制转移类指令分析 控制转移类指令分析 控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 [1].无条件转移指令(4条) 这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。 LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址) AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序计数器赋予新值(11位地址),(PC15-11)不改变 SJMP rel ;(PC)+ 2 + rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值 JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值 这几条指令,如果要他细分析的话,区别较大,但初学者时,可以不理会那么多,统统理解成LJMP标号,也就是跳转到一个标号处,但事实上,JMP标号,在前面的例程中我们已接触过,并且也知道如何来使用了,AJMP和SJMP也是一样,那么这几条指令它们的区别何在呢?在于跳转的范围不一样。好比跳远,LJMP一下就能跳64K那么远(当然近了就更没关系了)。而AJMP最多只能跳2K距离,而SJMP则最多只

条件转移指令

条件转移指令 条件转移指令是指在满足一定条件时进行相对转移。 1.判A内容是否为0转移指令 JZ rel JNZ rel 第一指令的功能是:如果(A)=0,则转移,否则顺序执行(执行本指令的下一条指令)。转移到什么地方去呢?如果按照传统的方法,就要算偏移量,很麻烦,好在现在我们可以借助于机器汇编了。因此这第指令我们可以这样理解:JZ 标号。即转移到标号处。下面举一例说明: MOV A,R0 JZ L1 MOV R1,#00H AJMP L2 L1: MOV R1,#0FFH L2: SJMP L2 END 在执行上面这段程序前如果R0中的值是0的话,就转移到L1执行,因此最终的执行结果是R1中的值为0FFH。而如果R0中的值不等于0,则顺序执行,也就是执行 MOV R1,#00H指令。最终的执行结果是R1中的值等于0。 第一条指令的功能清楚了,第二条当然就好理解了,如果A中的值不等于0,就转移。把上面的那个例子中的JZ改成JNZ试试吧,看看程序执行的结果是什么? 2.比较转移指令 CJNE A,#data,rel CJNE A,direct,rel CJNE Rn,#data,rel

CJNE @Ri,#data,rel 第一条指令的功能是将A中的值和立即数data比较,如果两者相等,就顺序执行(执行本指令的下一条指令),如果不相等,就转移,同样地,我们可以将rel理解成标号,即:CJNE A,#data,标号。这样利用这条指令,我们就可以判断两数是否相等,这在很多场合是非常有用的。但有时还想得知两数比较之后哪个大,哪个小,本条指令也具有这样的功能,如果两数不相等,则CPU还会反映出哪个数大,哪个数小,这是用CY(进位位)来实现的。如果前面的数(A中的)大,则CY=0,否则CY=1,因此在程序转移后再次利用CY就可判断出A中的数比data大还是小了。 例: MOV A,R0 CJNE A,#10H,L1 MOV R1,#0FFH AJMP L3 L1: JC L2 MOV R1,#0AAH AJMP L3 L2: MOV R1,#0FFH L3: SJMP L3 上面的程序中有一条指令我们还没学过,即JC,这条指令的原型是JC rel,作用和上面的JZ类似,但是它是判CY是0,还是1进行转移,如果CY=1,则转移到JC后面的标号处执行,如果CY=0则顺序执行(执行它的下面一条指令)。 分析一下上面的程序,如果(A)=10H,则顺序执行,即R1=0。如果(A)不等于10H,则转到L1处继续执行,在L1处,再次进行判断,如果(A)>10H,则CY=1,将顺序执行,即执行MOV R1,#0AAH指令,而如果(A)<10H,则将转移到L2处指行,即执行MOV R1,#0FFH指令。因此最终结果是:本程序执行前,如果(R0)=10H,则(R1)=00H,如果(R0)>10H,则(R1)=0AAH,如果(R0)<10H,则(R1)=0FFH。 弄懂了这条指令,其它的几条就类似了,第二条是把A当中的值和直接地址中的值比较,第三条则是将直接地址中的值和立即数比较,第四条是将

控制转移类指令

控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 [1]. 无条件转移指令(4条) 这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。 LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址) AJMP addr11 ;(PC)+2→(PC),addr11→(PC10-0)程序计数器赋予新值(11位地址),(PC15-11)不改变 SJMP rel ;(PC)+ 2 + rel→(PC)当前程序计数器先加上2再加上偏移量给程序计数器赋予新值 JMP @A+DPTR ;(A)+ (DPTR)→(PC),累加器所指向地址单元的值加上数据指针的值给程序计数器赋予新值 这几条指令,如果要他细分析的话,区别较大,但初学者时,可以不理会那么多,统统理解成LJMP标号,也就是跳转到一个标号处,但事实上,JMP标号,在前面的例程中我们已接触过,并且也知道如何来使用了,AJMP和SJMP也是一样,那么这几条指令它们的区别何在呢?在于跳转的范围不一样。好比跳远,LJMP一下就能跳64K那么远(当然近了就更没关系了)。而AJMP最多只能跳2K距离,而SJMP则最多只能跳256这么远,原则上,所有用AJMP或SJMP的地方都可以用LJMP来替代。因此在初学者时,需要跳转时可以全用LJMP。 但是在查表时要注意会出错,因为他们的机器周期不一样,取得的数也不一样。

实验四---条件转移指令

实验四条件转移指令 实验目的: 通过实验掌握下列知识: 1、8086指令:JZ,JNZ,JC,JNC,CMP,SHR。 2、程序:用字符搜索法确定字符串长度。 3、程序:16进制数化为ASCII码的一般方法。 实验容及步骤: 一、用字符搜索法确定字符串长度: 1、用A命令在100H开始的存处键入下列程序: JMP START ;无条件调至Start 偏移地址为102 DB 'This is the program to measure' ;定义一个字符串长度为30 DB 'the length of a string!$' ;定义字符串,长度为23 不算字符串结束符$ START: MOV BX,102 ;容为102赋给bx MOV AL,24 ;24赋给al XOR CL,CL ;cl清零 LOP: CMP AL,[BX] ;地址[0102]的容和24表示的字符$比较大小 JZ EXIT ;遇到$,调至exit,程序结束 INC BX ;bx自增1 INC CL ;cl自增1 JMP LOP ;无条件转移至lop EXIT: INT 3 2、用G命令运行此程序,并检查CL的统计长度是否与你自己统计的实际长度是否一样?

二、16进制数化ASCII码的一般方法(显示存容) 1、用A命令在100H处键入下列程序: MOV SI,0 ;将容为0的十六进制数赋给si MOV BL,10 ;将容为10的十六进制数赋给bl LOP: MOV DL,[SI] ;将地址为[0]单元的容赋给dl MOV CL,4 ;将4赋给cl SHR DL,CL ;dl的容逻辑右移4次,最低位进入cf CMP DL,0A ;dl的容和0a比较大小 JC J1 ;判断有无进位,有了转向j1 ADD DL,7 ;无进位,将7和dl的容相加 J1: ADD DL,30 ;将30和dl的容相加 MOV AH,2 ;设置功能号:2赋给ah INT 21 ;dos功能调用:显示dl寄存器的容 MOV DL,[SI] ;将[0]的容赋给dl AND DL,0F ;dl的容和0f相加 CMP DL,0A ;dl的容和0a比较大小 JC J2 ;判断有无进位,有了转向j2 ADD DL,7 ;无进位,将dl的容和7相加放入dl中 J2: ADD DL,30 ;有进位,将dl的容和30相加放入dl中 MOV AH,2 ;设置功能号:2赋给ah INT 21 ;dos功能调用:显示dl寄存器的容 MOV DL,20 ;将20赋给dl 输入一个空格字符 MOV AH,2 ;设置功能号:2赋给ah INT 21 ;dos功能调用:显示dl寄存器的容 INC SI ;si自增1 DEC BL ;dl自减1 JNZ LOP ;判断结果,若为0调至lop INT 20 ;中断程序 将十六进制数AB A先显示再让B显示再有空格的显示所以执行后执行前结果一样了 0-9 A-F十六进制数转换为ASCII码31-39 41-46 2、用N,W命令将此程序用https://www.sodocs.net/doc/ce11122262.html,文件名存入磁盘。 3、用Q命令退出DEBUG。 4、在DOS命令状态下直接运行https://www.sodocs.net/doc/ce11122262.html,命令文件,应在屏幕上显示出存从0000H开始的16个字节的容,若有错误,用DEBUG检查之。 5、自编程序:修改上面程序,使除以16进制数形式显示存容外,还能在其右边显示该16进制码所对应的ASCII字符,07-0D的控制字符用'.'代替。

无条件转移指令(共4条)

MCS-51的控制转移类指令,共17条,分为无条件转移指令、条件转移指令、子程序调用和返回指令、空操作指令等四类。 无条件转移指令(共4条) LJMP addr16 ;PC〈——addr16 AJMP addr11 ;PC〈——PC+2 ,PC10-0〈——addr11 SJMP rel ;PC〈——PC+2 ,PC 〈——PC+rel JMP @A+DPTR ;PC〈——A+DPTR 第一条指令称为长转移指令(Long Jump); 第二条指令叫作绝对转移指令(Absolute Jump); 第三条指令称作短转移指令(Short Jump); 第四条指令是变址寻址转移指令(散转指令)。 显然,每条指令均以改变程序计数器PC(Program Counter)中的内容为宗旨。 (1)长转移指令(64KB范围内转移指令) 长转移指令的功能是:把指令码中的目标地址addr16装入程序计数器PC,使机器执行下一条指令时无条件转移到addr16处执行程序,不影响任何 标志。由于addr16是一个16位二进制地址(地址范围为0000H—FFFFH),因此长转移指令一条可以在64KB范围内转移的指令。为了使程序设计方便易编,addr16常采用标号地址(如:LOOP、LOOP1、MAIN、START、DONE、NEXT1……)表示,只有在上机执行前才被汇编(或代真)为1 6位二进制地址。长转移指令为三字节,双周期指令。上机试试吧!很直观的! For Example:LJMP F886H 注意:在下载的这个8051DEBUG软件中,不支持标号,且程序状态字PSW(P rogram State Word)中的D0位,即奇偶标志位P,与正确的正好相反,这一点是错误的,用的时候留意一下。 只要记好:累加器ACC中1的个数为奇数,则P=1;否则P=0。 (2)绝对转移指令(2KB范围内的转移指令) 绝对转移指令是一条双字节双周期指令,11位地址addr11(a10—a0)在指令中的分布是:a10 a9 a8 0 0 0 1|a7 a6 a5 a4 a3 a2 a1 a0,其中,00001B是操作码。在程序设计中,11位地址也可以用符号表示,但在上机执行前必须按照上述指令格式加以代真。 绝对转移指令执行时分为两步: 第一步是取指令操作,程序计数器PC中内容被加1两次; 第二步是把PC加2后的高5为地址PC15—PC11和指令代码中低11位构成目

条件转移类指令范例

条件转移类指令范例——方案 将00H~0FH这16个数顺序地置入片内RAM20H~2FH单元中。 一、MOV R0,#20H CLR A LOOP:MOV @R0,A INC A INC R0 DJNZ R7,LOOP SJMP $ 三、MOV R0,#20H MOV A,#0FH MOV 30H,#00H LOOP:MOV @R0,30H INC 30H INC R0 DEC A JNZ LOOP SJMP $ 四、MOV R0,#20H MOV A,#0FH MOV 30H,#00H LOOP:MOV @R0,30H INC 30H INC R0 SUBB A,#01H JNC LOOP SJMP 【例】设(SP)=30H,符号地址PROG1指向程序存储器的5678H单元,当前PC值为0123H。从0123H处执行指令“LCALL PROG1”,分析执行后PC、SP的值和相关存储器的内容。 解:执行过程为: (PC)+3=0123H+3=0126H。 将PC内容压入堆栈:向(SP)+1=31H中压入26H,向(SP)+1=32H中压入01H,(SP)=33H。 将PROG1=5678H送入PC,即(PC)=5678H。程序转向以5678H为首地址的子程序执行。最终执行结果是:(PC)=5678H、(SP)=33H、(31H)=26H、(32H)=01H。 【例】利用DJNZ指令和NOP指令编写一循环程序,实现延时1ms(晶振频率为12MHz)。解:程序如下: DELAY: MOV R1,#0AH ;1μs LOOP: MOV R2,#30H ;1μs DJNZ R2,$ ;2×48μs DJNZ R1,LOOP ;1μs×(1+2×48+2)×10 NOP ;1μs NOP ;1μs NOP ;1μs

控制转移类指令和位操作指令

控制转移类指令和位操作指令 (一).控制转移类指令 计算机运行过程中,有时因为操作的需要,程序不能按顺序逐条执行指令,需要改变程序运行方向,即将程序跳转到某个指定的地址再顺序执行下去。 控制转移类指令的功能就是根据要求修改程序计数器PC的内容,以改变程序运行方向,实现转移。 控制转移类指令可分为:无条件转移、条件转移、绝对转移、相对转移和调用、返回指令。下面我们将分类介绍。 1.无条件转移指令(4条) LJMP add16 ;add16→PC,无条件跳转到add16地址,可在64KB范围内 转移,称为长转移指令 AJMP add11 ;add11→PC,无条件转向add11地址,在2KB范围内转移 SJMP rel ;PC+2+rel→PC,相对转移,rel是偏移量,8 位有符号 数,范围-128~127,即可向后跳转128,向前可跳转 127 JMP @A+DPTR ;A+DPTR→PC ,属散转指令,无条件转向A与DPTR内容 相 加后形成的新地址 例执行指令 LJMP 9100H 不管这条指令存放在哪里,执行时将使程序转移到9100H,和AJMP,SJMP指令是有差别的。 例程序 2000H MOV R0 , #10H ;10H→PC 2002H SJMP 03H ;PC+2+rel=2002H+2+03H=2007H→PC ┇┇ 2006H ┇ 2007H ┇ 从说明中可见,执行SJMP 03H 指令后,马上跳转到2007H地址执行程序。 2.条件转移指令(8条) 条件转移指令是根据某种特定条件转移的指令。条件满足时转移,条件不满足时则顺序 执行下面的指令。 JZ rel ;A=0转向PC+2+rel→PC,A≠0顺序执行 JNZ rel ;A≠转向PC+2+rel→PC ,A=0顺序执行

微机原理练习-控制转移类指令

微机原理练习 - 控制转移类指令 一、低难度: 等待P1.0出现低电平 JNB P1.0,$ JB P1.0,$ 原地等待 SJMP $ A减一非0转到L,否则转到L0 DJNZ A,L SJMP L0 If A>0 then goto L else goto L1 JZ L1 JB ACC.0,L1 SJMP L If A>=0 then goto L else goto L1 JB ACC.7,L1 SJMP L If A<0 then goto L else goto L1 JB ACC.7,L SJMP L1 If A<=0 then goto L else goto L1 JZ L JB ACC.0,L SJMP L1 If A=0 then goto L else goto L1 JZ L SJMP L1

If A<>0(<>为不等) then goto L else goto L1 JZ L1 SJMP L 二、中难度: 用判断进位方法处理高字节,进行@R0(2):=@R0(2)+@R1(2) 当标志Flag=1时执行一次子程序Sub A取绝对值 JNB ACC.7,L CPL A INC A 如果A>=数80H则减去数80H CLR ACC.7 将RAM00H~FFH清为0 MOV R0,#0 L:MOV @R0,#0 INC R0 CJNE R0,#00H,L RAM30H~3FH->RAM20H~2FH Dec Dptr MOV A,DPL JNZ L DEC DPH L:DEC DPL Inc R67 CJNE R7,#0FFH,L INC R6 L:INC R7

控制转移类指令

控制转移类指令 ?用于实现分支、循环、过程等程序结构,是仅次于传送指令的最常用指令. ?控制转移类指令通过改变IP(和CS)值,实现程序执行顺序的改变 说明 ?只有中断返回指令(IRET)改变控制标志位 ?许多转移指令受状态标志位的影响 1.无条件转移指令(JMP 操作数;程序转向label标号指定的地址) ◆寻址方式: 直接寻址方式 转移地址象立即数一样,直接在指令的机器代码中,就是直接寻址方式 间接寻址方式 转移地址在寄存器或主存单元中,就是通过寄存器或存储器的间接寻址方式 ◆目标地址范围 ?段内(注意转移范围是+ -,即前后都可以转移!当向地址增大方向转移时,位移量为正;向地址减小方向转移时,位移量为负) ?段内转移——近转移(near) ?转移范围用二个字节表达,在当前代码段64KB范围内转移(±32KB范围) ?不需要更改CS段地址,只要改变IP偏移地址,由16位带符号数给出。 ?段内转移——短转移(short) ?转移范围用一个字节表达,在当前代码段256B范围内转移(-128~+127范围), 只改变IP的值,由8位带符号数给出。 ?段间 段间转移——远转移(far) 从当前代码段跳转到另一个代码段,可以在1MB范围 需要更改CS段地址和IP偏移地址 目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址。段间间接转移指令中,目的地址存放在连续4个存储单元字节中,低字节两个单元的内容代替IP,高字节两个单元的内容代替CS。 注:实际编程时,汇编程序会根据目标地址的距离,自动处理成短转移、近转移或远转移程序员可用操作符short、near ptr或far ptr强制. ?思考: 如果转移超过16BIT,怎么办? 答:变成段间转移。 JMP 1234H 这个指令对否?JMP 12345678H呢? 2、条件转移指令(Jcclable;条件满足,发生转移:IP←IP+8位位移量;条件不满足,顺序执行) 注意:1.Jcc本身不是一条指令,它是条件转移指令的统称。 2.操作数label是采用短转移,条件转移只能是短转移。 3.8位位移量是相对于当前IP的,相对寻址方式。 4.Jcc指令为2个字节,条件不满足时的顺序执行,就是当前指令偏移指针IP加。 5.不影响标志,但要利用标。 16条指令分成4种情况: ⑴判断单个标志位状态 ⑵比较无符号数高低

实验五 条件转移指令

实验五条件转移指令 实验目的 通过实验掌握下列知识: 1、8086指令:JZ,JNZ,JC,JNC,CMP,SHR。 2、程序:用字符搜索法确定字符串长度。 3、程序:十六进制数化为ASCII码的一般方法。 实验内容及步骤 一、用字符搜索法确定字符串长度 1、用A命令在100H开始的内存处键入下列程序: JMP START DB 'This is the program to measure' DB 'the length of a string!$' START: MOV BX,102 MOV AL,24 XOR CL,CL LOP: CMP AL,[BX] JZ EXIT INC BX INC CL JMP LOP EXIT:INT 3 2、用G命令运行此程序,并检查CL的统计长度是否与你自己统计的实际长度是否一样? 注:MOV AL,24中24H为$的ASCII码。 二、十六进制数转化为ASCII码的一般方法(显示内存内容) 1、用A命令在100H处键入下列程序: MOV SI,0 MOV BL,10 LOP:MOV DL,[SI] MOV CL,4 SHR DL,CL CMP DL,0A

JC J1 ADD DL,7 J1: ADD DL,30 MOV AH,2 INT 21 MOV DL,[SI] AND DL,0F CMP DL,0A JC J2 ADD DL,7 J2:ADD DL,30 MOV AH,2 INT 21 MOV DL,20 MOV AH,2 INT 21 INC SI DEC BL JNZ LOP INT 20 2、用N,W命令将此程序用https://www.sodocs.net/doc/ce11122262.html,文件名存入磁盘。 3、用Q命令退出DEBUG。 4、在DOS命令状态下直接运行https://www.sodocs.net/doc/ce11122262.html,命令文件,应在屏幕上显示出内存从0000H开始的16个字节的内容,若有错误,用DEBUG检查之。 5、自编程序:修改上面程序,使除以十六进制数形式显示内存内容外,还能在其右边显示该十六进制码所对应的ASCII字符,07-0D的控制字符用'.'代替。 三、综合程序(选做):测量一字符串长度,并用十六进制数显示之 程序内容: JMP START DB 'This is a program to measure the length of a string。' DB 0D,0A DB 'the length of the string is: $' START:MOV AH,9 MOV DX,102 INT 21

第11讲 控制转移类指令(二)

第十一讲控制转移类指令 教学方法: 讲授法 教学目的: 1、了解控制转移类指令的分类 2、掌握条件转移指令的特点及应用 教学重点: 条件转移指令的特点及应用 教学难点: 条件转移指令的特点及应用 教学环节 组织教学:(2分钟)检查学生人数,强调作业要求。 复习提问:1、控制转移指令是如何分类的? 2、无条件转移指令、调用指令分是哪几个? 引入新课: 二、条件转移指令 实现按照一定条件决定转移的方向。分三类。 1、判零转移 JZ rel JNZ rel JZ rel ;若(A)= 0 ,则转移,否则顺序执行。 JNZ rel ;若(A)≠0,则转移,否则顺序执行。 转移目的地址= (PC)+ 2 + rel 不影响任何标志位。 例1、将外RAM的一个数据块(首地址为DATA1)传送到内部数据RAM(首地址为DATA2),遇到传送的数据为零时停止传送,试编程。 解:MOV R0,#DATA2 MOV DPTR,#DATA1 LOOP1:MOVX A,@DPTR JZ LOOP2 MOV @R0,A INC R0 INC DPTR SJMP LOOP1 LOOP2:SJMP LOOP2 2、比较转移指令 功能:比较二个字节中的值,若不等,则转移。

CINE A,#data,rel CJNE A,direct,rel CJNE @Ri,#data,rel CJNE Rn,#data,rel 该类指令具有比较和判断双重功能,比较的本质是做减法运算,用第一操作数内容减去第二操作数内容,但差值不回存。 转移目的地址= (PC)+ 3 + rel 若第一操作数内容小于第二操作数内容,则(C)= 1,否则(C)= 0。 该类指令可产生三分支程序: 即,相等分支;大于分支;小于分支。 例2、设P1口的P1.0 ~ P1.3为准备就绪信号输入端,当该四位为全1时,说明各项工作已准备好,单片机可顺序执行,否则,循环等待。 解:MOV A,P1 ANL A,#0FH CJNE A,#0FH,WAIT ;P1.0 ~ P1.3不为全1时,返回WAIT MOV A,R2 ······ 3、循环转移指令 DJNZ Rn,rel ;(二字节指令) DINZ direct,rel ;(三字节指令) 本指令也为双功能指令,即减1操作和判断转移操作。 第一操作数内容减1后,若差值不为零,则转移;否则顺序执行。 转移目的地址= (PC)+ 2或3 + rel 例3、将8031内部RAM的40H ~ 4FH单元置初值#A0H ~ #AFH。 解:MOV R0,#40H MOV R2,#10H MOV A,#0A0H LOOP:MOV @R0,A INC R0 INC A DJNZ R2,LOOP ······ 小结:1、无条件转移指令共有几条? 2、CJNE指令与DJNZ指令有何区别?

汇编(十五)控制转移类指令一

汇编(十五)——控制转移类指令一 Intel 8086中,程序的执行序列是由代码段寄存器CS 和指令指针IP确定的。CS包含当前指令所在代码段的段地址,IP则是要执行的下一条指令的偏移地址。程序的执行一般是依指令序列顺序执行,但有时候需要改变程序的流程,实现分支程序。控制转移类指令通过修改CS和IP的值改变程序的执行顺序,实现分支。分支程序有时根据某个条件转移执行,有时无条件条转到某条指令执行,转移指令的目标地址是代码段中某个指令的位移量,这个位移量是用标号来指出的。一、标号 标号(过程名亦视为标号)用来说明可执行指令在汇编语言程序中的位置(从这个角度来说,变量应用于说明伪指令的位置)。标号可以作为转移指令(或调用指令CALL)的操作数。和变量类似,标号有三种属性:段(SEGMENT)、位移量(OFFSET)和距离(DISTANCE)。段和位移量属性就是在哪个段、什么位置上定义的标号。标号只要有了定义,这两个属性就自然的产生。如果标号只能在本段中(即标号所定义的段中)用JMP或条件转移指令(或CALL)进行访问,那么必须将这个标号的距离属性定义为NEAR;如果标号能为其他段中的JNMP(或CALL)指令访问,则需将标号的距离属性定义为FAR。标号的距离属性需要再定义标号

时指出。 1、标号的定义 (1)定义距离属性为NEAR的标号 1)距离属性为NEAR的标号可以用隐含的说明,即在标号名后面加上冒号,放在指令前面。如: L1: MOV AX,BX @: ADD AX,100 2)距离属性为NEAR的标号也可以用现实说明,即用LABEL 位指令明显说明,或在EQU位指令中用THIS操作符明显的指出。如: L2 LABEL NEAR MOV CX,5 L3 EQU THIS NEAR AND AX,0FFH (2)定义距离属性为FAR的标号 距离属性为FAR的标号只能显示说明 L4 LABEL FAR MOV AX,DX L5 EQU THIS FAR OR AL,30H (3)同一条指令处可以定义两个距离属性不同的标号,以提高访问标号的灵活性。

控制转移指令

控制转移指令 通常,程序中的指令都是顺序地逐条进行的,在8086中,指令的执行顺序由CS和IP 决出,每取出一条指令,指令指针IP自动进行调整,一条指令执行完成后,就从该指令之后的下一个存储单元中取出一条指令来执行。利用控制转移指令可以改变CS和IP的值,从而改变指令的执行顺序。为满足程序转移的不同要求,8086提供了无条件转移和过程调用、条件转移、循环控制以及中断指令等几类指令。 无条件转移指令和过程调用指令:JMP—无条件转移、CALL—过程调用、RET—过程返回条件转移:JZ\JE等十条指令—直接标志转移、JA\JNBE等8条指令—间接标志转移 条件循环控制:LOOP—CX≠0则循环、LOOPE和LOOPZ—CX≠0和ZF=1则循环、LOOPNE 和LOOPNE—CX≠0和ZF=0则循环、JCXZ—CX=0则循环 中断:INT—中断、INTO—溢出中断、IRET—中断返回 1、无条件转移和过程调用指令 1)JMP 无条件转移指令 指令格式:JMP 目的 指令功能:使程序无条件转移到指令中指定的目的地址去执行。 这类指令又分为两种类型: 第一种类型:段内转移或近(NEAR)转移,转移指令目的地址和JMP指令在同一代码段中,转移时仅改变IP寄存器的内容,段地址CS的值不变。 第二种类型:段间转移,又被称之为远(FAR)转移,转移指令的目的地址和JMP指令不在同一代码段中,发生转移时,CS和IP 的值都要改变也就是说,程序要转移到另一个代码段中去执行。 不论是段内还是段间转移,就转移地址提供的方式而言,又可分为两种方式: 第一种方式:直接转移,在指令码中直接给出转移的目的地址,目的操作数用一个标号来表示,它又分为段内直接转移和段间直接转移。 第二种方式:间接转移,目的地址包含在某个16位寄存器或存储单元中,CPU必须根据寄存器或存储器的寻址方式,间接地求出转移地址。同样,这类转移也可分为段内间接转移和段间间接转移。 所以无条件转移指令可分为段内直接转移、段内间接转移、段间直接转移、段间间接转移这四种不同类型和方式。 段内直接转移指令 指令格式:JMP SHORT 标号 JMP NEAR PTR 标号(或JMP 标号) 这是一种段内相对转移指令,目的操作数均用标号表示,程序转向的有效地址等于当前IP 寄存器内容加上8位或者16位位移量(DISP).如果位移量位是16位,那么表示近转移,说

相关主题