首页 > 其他分享 >控制转移指令

控制转移指令

时间:2024-10-17 08:51:36浏览次数:9  
标签:控制 16 IP JMP 指令 CALL CS 转移

S B老师根本讲不明白,选的教材也垃圾,很多重要的东西一笔带过,什么玩意儿啊
这里面和伪指令有关的内容下一篇文章再叙述。
我靠。知道吗!我翻遍了整本书关于call指令,它只有不到一页的内容!那么重要的指令CALL和RET,是C语言函数调用的根本,但这两条指令加起来只用了一页就讲完了。
当然这也不奇怪,毕竟所有的寄存器介绍和指令介绍,只有100页。人家王爽老师的《汇编语言》可是写了一本书啊。

功能:改变程序执行顺序(改变IP和CS)。
执行顺序由代码段寄存器和指令指针IP的内容确定,CS和IP结合起来,给出下一条指令在存储器中的位置。

对于转移指令:

  • 转移指令的实质:改变IP(或CS)的内容。
  • 所有转移指令不会影响标志位。
  • 分为无条件转移和条件转移两种。

过程调用和返回指令:

过程(子程序):一段具有特定功能的,供其它程序调用的公用程序。

  • 调用子程序时,IP(CS)的内容被压入堆栈栈顶。从子程序返回时,栈顶的内容又被弹出到IP(CS)。
  • 子程序执行结束后一般都要返回调用程序。
  • 一次定义,多次调用。
  • 可带参数调用(提前放到栈或寄存器中)。

段内:只会改变IP
段间:CS和IP都变
直接:地址由#imm给出
间接:地址由reg或mem给出

无条件转移指令

JMP

  • 段内直接转移: JMP #imm(8/16)
    指令中直接给出的8/16位的偏移量加到IPCS保持不变。
JMP SHORT #imm8      ; 段内直接短转移
; IP = IP + imm(8)
JMP #imm16            ; 段内直接近转移
JMP NEAR PTR #imm16   ; 
; IP = IP + imm(16)
JMP WORD PTR #imm   ; 段内间接转移
; IP = imm
  • 段内间接转移: JMP reg(16)/mem(16)
    reg/mem中的16位偏移地址送IP。CS保持不变。
    转移的目标地址由寄存器或存储单元的内容给出。
JMP reg/mem  ; 默认取一个16位数作为IP的值
JMP SI
; IP = SI
JMP WROD PTR[BX+DI]
; IP = [BP:BX+DI]

目标地址以段内偏移的形式给出,而不是相对于IP的位移量,所以它是一个16位的操作数

  • 段间直接转移 JMP segment(16):offset(16)
    指令中给出的转移地址的16位的段和16位的偏移地址送到CSIP
JMP #imm1:#imm2
; CS = #imm1
; IP = #imm2
JMP FAR PTR label
; CS:IP = label
  • 段间间接转移 JMP mem(32)
    指令中给出[mem]中的16位的段和16位的偏移地址送到CSIP
    OPR只能是存储器操作数
JMP DWROD PTR #imm
; IP = [#imm]
; CS = [#imm+2]

条件转移指令

JXX   label

条件转移指令的段内、段间、直接、间接都同上。
条件转移指令根据标志位来决定是否跳转。
指令的转移范围为-128~+127字节。

按所依据条件分三类:

  • 根据单个标志为条件进行测试:
  • 根据标志间的组合条件进行测试:这里面有符号和无符号数的比大小还不一样
  • 根据对CX寄存器值进行测试作为转移的依据:CX为0则跳转

在这里插入图片描述
在这里插入图片描述
CX为0,则跳转(因为CX总作为计数器使用)

JCXZ label




调用和返回指令

子程序的偏移地址或者段地址直接由CALL指令的操作数给出。
段内、段间、直接、间接都同上。
这里面所有的压栈、弹栈操作都会更改SP寄存器。

  • 段内直接调用

格式:CALL imm(16)
CALL执行时,它首先将IP内容压栈,然后把指令中给出的位移量加到IP上。

CALL 0120H
CALL NEAR PTR label
  • 段内间接调用
    格式:CALL mem(16)/reg(16)
    CALL执行时,它首先将IP内容压栈,然后把指令中给出的位移量加到IP上。
CALL BX             
; IP = BX
CALL WORD PTR[SI]   
; IP = [DS:SI]
  • 段间直接调用
  • CS内容压栈
  • IP内容压栈
  • CS←段地址
  • IP←偏移地址
CALL #imm1:#imm2
CALL FAR PTR label
  • 段间间接调用
    子程序的段和偏移地址为存储器的连续4个字节中的内容。前两个字是IP,节后两个字节是CS
CALL #imm
CALL DWORD PTR [DI]
; IP = [DI]
; CS = [DI + 2]

在这里插入图片描述

  • 返回指令RET

RET会自动的识别到底是段内返回还是段间返回,不用你考虑。它的格式是一样的。

段内返回:弹栈IP
段间返回:先弹栈IP再弹栈CS

RET     ; 
RET n   ; 返回后自动丢弃栈顶的n个字节,即更改SP寄存器
SP = SP + n

在这里插入图片描述




循环控制指令

  • 用在循环程序中以确定是否要继续循环。
  • 循环次数通常置于CX寄存器中,CX可以自动减一。
  • 转移的目标应在距离本指令-128~+127的范围之内。
  • 循环控制指令不影响标志位,但是有些会检测ZF标志位。
LOOP   label  ; CX不为0时循环
LOOPZ  label  ; CX不为0且相同时循环
LOOPNZ label  ; CX不为0且不同时循环
; 也不一定非得是CMP指令,一些加减指令也会出现改变ZF的情况

在这里插入图片描述

中断指令

标签:控制,16,IP,JMP,指令,CALL,CS,转移
From: https://blog.csdn.net/m0_73649248/article/details/142850855

相关文章

  • 【连续6届稳定EI检索】第七届电力电子与控制工程国际学术会议(ICPECE 2024)
    第七届电力电子与控制工程国际学术会议(ICPECE2024)由华东交通大学与辽宁科技学院联合主办,将于2024年10月18日至20日在中国·本溪举行。本次会议还得到了辽宁省机器人驱动控制工程实验室及辽宁省大型机械设备健康监测与维护技术工程研究中心的协办。高录用|快检索|JPCS独立出......
  • 【可答疑】基于51单片机的智能水温控制系统(含仿真、代码、报告、演示视频等)
     ✨哈喽大家好,这里是@每天一杯冰美式oh,985电子本硕,大厂嵌入式在职0.3年,业余时间做做单片机小项目,有需要也可以提供就业指导(免费)~......
  • JAVA程序流程控制与基本例题
    程序的三种执行顺序1.分支结构(1)if分支结果packagecom.branch;publicclassifDemo{publicstaticvoidmain(String[]args){//目标:掌握了解if语句三种形式的用法,清楚其写法和应用场景。demo3();demo2();demo1();}......
  • 2-STM32F103+ML307(中移4G Cat1)OTA升级篇(自建物联网平台)-STM32通过ML307使用http或
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ZLIOTB/ML307/myota.html"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  说明前面......
  • 第2课笔记 linux系统指令
    测试分类linux虚拟机搭建linux命令:一、linux介绍1、Linux是一个免费、开源的操作系统,能多用户、多任务、支持多线程和多CPU的操作系统,相对windows更加稳定,在unix系统的基础上开发的系统;注解:(1)免费:不要钱(2)源代码公开(3)多用户:可以在不同用户操作(4)多任务:同时执行多个任务......
  • 【Linux】解锁线程基本概念和线程控制,步入多线程学习的大门
    目录1、线程初识1.1线程的概念1.2.关于线程和进程的进一步理解1.3.线程的设计理念1.4.进程vs线程(图解)1.5地址空间的第四谈2.线程的控制:2.1.关于线程控制的前置知识2.2创建线程的系统调用:这个几号手册具体代表的什么含义?2.3.线程终止我们怎么没有像进程一样获取线程......
  • 【Shiro】9.前端页面授权控制
     shiro可以与前端Thymeleaf结合,进行前端授权认证。由于,“吾生而有涯,而知而无涯”。所以,有限的生命不能照单全收无限的知识。而,前后端分离,必定是大趋势。所以,我就不额外写代码。截图记账理解一下。1.pom.xml页面引入Thymeleaf依赖。 2.配置类添加新配置 3.前端页面引入Sh......
  • 【西安理工大学主办,EI稳定检索】第三届航空航天与控制工程国际学术会议 (ICoACE 2024)
    会议目录1、会议重要信息2、会议论文出版3、会议征稿主题4、参会方式1、会议重要信息第三届航空航天与控制工程国际学术会议(ICoACE2024)20243rdInternationalConferenceonAerospaceandControlEngineering会议时间:2024年11月29日-12月1日会议地点:陕西......
  • OS-Lab2-Linux进程控制相关命令和系统调用(含gcc编程)
    实验目的1) 概念:Linux的gcc编译器2) 演示/实践:gcc编译器的初步和入门(编写一个带printf的while程序)3) 演示/实践:Linux进程控制相关的命令(如ps/pstree/top/kill/等)演示/实践:Linux进程控制相关的系统调用(如fork()/getpid()等)4) 概念:Linux的gdb调试器5) 概念:Linux的make工具及其Makefi......
  • Kotlin 入门教程:流程控制
    我们有时希望程序能够根据不同的条件来决定是否执行某些代码段(条件判断),或者反复执行某段代码直到满足特定条件为止(循环),这些功能的实现方式统称为「流程控制」;本文介绍Kotlin的流程控制。本文出现的所有代码均可在Kotlin官方在线代码调试器运行,部分代码下方也会提供链接......