汇编 无条件转移和过程调用指令

发布者:之敖赵先生最新更新时间:2022-10-25 来源: csdn关键字:汇编 手机看文章 扫描二维码
随时随地手机看文章

(1)JMP无条件转移指令


指令格式:

JMP 目的


指令功能:

使程序无条件地转移到指令中指定的目的地去执行。

这类指令又分为两种类型:

第一种类型:段内转移或近(NEAR)转移,转移指令的目的地址和JMP指令在同一代码段中,转移时仅改变IP寄存器的内容,段地址CS的值不变。

第二种类型:段间转移,又被称之为远(FAR) 转移,转移指令的目的地址和JMP指令不在同一段中,发生转移时,CS和IP的值都要改变——程序要转移到另一个代码段去执行。

无条件转移指令的类型和方式

image.png

段内直接转移指令

指令格式:

JMP SHORT       标号

JMP NEAR   PTR  标号(或JMP 标号)


jmp指令能够修改 IP 或 CS 或者同时修改的指令


CS:段地址

IP:偏移地址

通过以下指令,修改段地址和偏移地址


jmp 4000:0

在这里插入图片描述

jmp 2600:500

在这里插入图片描述

错误的修改CS和IP的方式:


mov cs,2000


mov ip,500


mov ip,ax


以上三条修改方式均是错误的修改方式。


注意:用以下方式虽然编译成功,但是也不能对CS进行正确的修改。


mov ax,500

mov cs,ax

在这里插入图片描述

但是用以下这种方式对IP进行修改:


mov ax,500

jmp ax

在这里插入图片描述

指令执行的过程:


1.CPU从 cs:ip 所组成的地址中读取指令,将这个指令存放到指令缓存器中

2.IP = IP + 所读指令的字节数

3.执行指令缓存器中的内容,回到步骤 1 重复这个过程。

假设cs = 2000, IP = 0000, 写出指令执行的过程


a 2000:0

mov ax,6622   ; cs = 2000, ip = 0 + 3 = 3

jmp 1000:3     ;  cs =2000, ip= 3 + 5  = 8

mov cx,ax


a 1000:0        

mov ax,0123    ; cs = 1000  ip = 0 + 3 = 3

mov ax,0          ; cs = 1000  ip = 3 + 3 = 6

mov bx,ax       ; cs =  1000  ip = 6 + 2 =8

jmp bx              ;cs = 1000  ip = 0

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

例:


mov ax,bx     ; ax = bx

sub ax,ax      ; ax = ax - ax =0

jmp ax           


mov ax,bx     ; => 指令缓存器 => 1   =>  执行

sub ax,ax      ; => 指令缓存器 = > 1  = > 执行

jmp ax           ; => 指令缓存器 = > 1   => 执行 => 1

在这里插入图片描述

上面3条指令执行后,cpu 4次修改了IP,最后一次IP的值为0


用3条指令写入从2000:0开始的内存单元,利用3条指令计算 2 的 8 次方


mov ax,1

add ax,ax

jmp 2000:3

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

(2)过程调用和返回指令

在编写程序时,往往把某些能完成特定功能而又经常要用到的程序段,编写成独立的模块,并把它成为过程,习惯上也称为主程序,然后在程序中用CALL语句调用这些过程,调用过程的程序称为主程序。若在过程运行中又去调用另一个过程,称为过程嵌套。它使程序结构清晰,可读性强,同时也能节省内存。


过程调用和返回指令的格式如下:


CALL 过程名

RET


过程调用有近调用和远调用两种类型 。

例如:

在这里插入图片描述

上面程序代码执行的顺序:


call cpy_Boot                 ; 执行该代码后,会跳转到 cpy_Boot ,执行到ret 后跳转到 call cpy_Boot下面的代码继续执行。(类似 C语言的goto)

=============================================================

cpy_Boot:

mov bx,1000H

mov bx,1001H

mov bx,1002H

mov bx,1003H

mov bx,1004H

ret


mov ax,1000H

mov ax,1001H

mov ax,1002H

mov ax,1003H

mov ax,1004H

mov ax 4c00H

int 21H

关键字:汇编 引用地址:汇编 无条件转移和过程调用指令

上一篇:汇编 debug调试
下一篇:汇编语言 数据寄存器AX、BX、CX、DX

推荐阅读最新更新时间:2024-11-19 14:12

12864液晶显示源程序汇编程序
;12864液晶显示源程序全部程序如下: ;============================ COM EQU 20H LINE EQU 31H DAT EQU 21H COLUMN EQU 30H PAGE0 EQU 31H CODE0 EQU 32H COUNT EQU 33H CSA EQU P3.2 ;15 CSB EQU P3.4 ;16 D_I EQU P3.7 ;4 R_W EQU P3.6 ;5 E EQU P3.5 ;6 ;=======================================
[单片机]
ARM汇编语言中MOV MVN LDR区别
个人总结,如有错误,欢迎纠正,谢谢!!! MOV指令可以完成从另一个寄存器,被移位的寄存器或将一个立即数加载到目的寄存器。 例如: MOV R1, R0 MOV R1, R0, LSL #3 MOV R1 , #3 但把立即数赋给一个寄存器,对立即数的范围有要求。只能是由8bit连续有效位通过偶 数次移位能得到的数。如果立即数超出这个范围,就没办法用一条MOV指令给寄存器赋值。 例如: MOV R0, #0xFF 这条指令的意思是将0xFF这个立即数复制到R0寄存器中去,且MOV 指令只能将寄存器 中的数相互的复制。 MVN指令可以完成从另一个寄存器,被移位的寄存器或将一个立即数加载到目的寄存器。 与MOV指令
[单片机]
51单片机驱动ads774汇编程序
51单片机驱动模数转换器ads774数据采集汇编程序,脉冲6061五个,BCD码78~7B,段码70~73,TIM0用7FH,看门狗P3.3 。 ORG 0 LJMP MAIN ORG 000BH TM1:LJMP TIM0 ORG 0100H MAIN:MOV SP,#30H MOV R0,#20H;20--7F=0 CLR A MOV R7,#60H INB1:MOV @R0,A INC R0 DJNZ R7,INB1 MOV IP,#02H MOV 7FH,#7 MOV TMOD,#11H MOV TL0,#0AEH MOV TH0,#74H SETB TR0 SETB ET0 CLR P3.3 ;WATCH DO
[单片机]
51 单片机汇编编程:记录按键
;有个题目,要求记录按下的键的编号。 ;使用器件: ;51单片机,8个编号为“1~8”的数字键,1个功能键,1个数码管,其他晶振电阻电容。 ;实现功能: ;按下功能键后,10s内,检测被按下的数字键, ;10s后,结束检测,并用数码管循环显示被按下过的键编号。 ;做而论道据此画出的电路如下: ;电路中的数码管,不仅用于显示按下过的键编号,还能显示 9~0 的倒计时。 ;在电路中,还安装了一个 LED,用来表示按键的状态。 ;当有键按下,10ms 后仍然按下时,LED 将发光,表示按键确实按下了。 ;当按键释放后,再令 LED 熄灭。 ;另外,在显示按下的按键编号时,也令 LED 持续发光。 ;当 LED 熄灭
[单片机]
51 单片机<font color='red'>汇编</font>编程:记录按键
keil调试出现反汇编的解决方法
若经常出现反汇编要看Debug目录下的Load Application at Startup前面的勾是否打上。是否打上直接影响加载的程序,请看Edit前面的路径,编辑它。出现下面的形式。 重点看这一行。LOAD power.axf INCREMENTAL // Download (assumes that 'load application at startup' is unchecked) 意思是说若load application at startup前面没有打对勾,那么加载的程序将是power.axf。如果你是自己建立的工程,并且按照别的一个模板进行配置,这个地方一定要小心。要不会很头疼的。刚开始的
[单片机]
arm学习笔记五(c/c++与arm汇编混合编程)
常见方式: 1 在c/c++程序中嵌入汇编指令 语法格式: __asm { 汇编语言程序 } 2 在汇编程序中访问c/c++定义的全局变量 示例代码如下: test.c #include stdio.h int gVar_1=12; extern asmDouble(void) int main(void){ printf( original value of gVar_1 is %d ,gVar_1); admDouble(); printf( modified value of gVar_1 is %d ,gVar_1); return 0; } test.s AREA asmfil
[单片机]
ARM汇编中^、!、cxsf符号和movs等指令使用
.macro restore_user_regs ldr r1, ldr lr, ! @ !用来控制基址变址寻址的最终新地址是否进行回写操作, @ 执行ldr之后sp被回写成sp+#S_PC基址变址寻址的新地址 msrspsr,r1 @ 把cpsr的值保存到spsr中 ldmdb sp,{r0 - lr}^ @lr= ,r13= ,r12= ,......,r0= @ 因为没对pc赋值,所以^的表示将数据恢复到User模式的 寄存器组中 mov r0,r0 add sp,sp,#S_FRAME_SIZE - S_PC movs pc,lr
[单片机]
ARM<font color='red'>汇编</font>中^、!、cxsf符号和movs等<font color='red'>指令</font>使用
结合单片机用汇编实现I2CBUS总线协议
    I2C总线     I2C(Inter-Integrated Circuit)总线是由PHILIPS公司开发的两线式串行总线,用于连接微控制器及其外围设备。是微电子通信控制领域广泛采用的一种总线标准。它是同步通信的一种特殊形式,具有接口线少,控制方式简单,器件封装形式小,通信速率较高等优点。PHILIPS公司早在十几年前就推出了I2C串行总线,用于连接微控制器及其外围设备。它具备多主机系统所需的包括裁决和高低速设备同步等功能高性能串行总线。     I2C总线产生于在80年代,最初为音频和视频设备开发,如今主要在服务器管理中使用,其中包括单个组件状态的通信。例如管理员可对各个组件进行查询,以管理系统的配置或掌握组件的
[嵌入式]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved