windows系统-函数的条件分支实现用汇编语言解释

2023-05-16

下面让我们来看一下条件分支的实现方法。条件分支的实现方法同循环处理的实现方法类似,使用的也是cmp指令和跳转指令,这一点估计大家也预料到了。

没错,条件分支就是利用这些指令来实现的。不过,为了以防万一,我们来确认一下。代码清单10-11是,根据变量a的值来调用不同函数(MySub1函数、MySub2函数、MySub3函数)的C语言源代码。为了实现条件分支,这里使用了if语句。示例中被调用的各个函数,都不进行任何处理。将代码清单10-11的MyFunc函数处理转换成汇编语言源代码后,结果就如代码清单10-12所示。

代码清单10-11 进行条件分支的C语言源代码


   
  1.     //定义MySub1函数

  2.     void MySub1()

  3.     {

  4.           //不做任何处理

  5.     }

  6.  
  7.     //定义MySub2函数

  8.     void MySub2()

  9.     {

  10.         //不做任何处理

  11.     }

  12.  
  13.     //定义MySub3函数

  14.     void MySub3()

  15.     {

  16.         //不做任何处理

  17.     }

  18.  
  19.     //定义MyFunc函数

  20.     void MyFunc()

  21.     {

  22.         int a =123;

  23.         //根据条件调用不同的函数

  24.         if (a > 100)

  25.         {

  26.             MySub1();

  27.         }

  28.         else if (a < 50)

  29.         {

  30.             MySub2();

  31.         }

  32.         else

  33.         {

  34.             MySub3();

  35.         }

  36.     }

代码清单10-12 将代码清单10-11的MyFunc函数转换成汇编语言后的结果


   
  1.     _MyFunc         proc     near

  2.             push    ebp;

  3.             mov     ebp, esp;

  4.             mov     eax,123         ;把123存入eax寄存器中

  5.             cmp     eax,100         ;把eax寄存器的值同100进行比较

  6.             jle     short @8        ;等于或小于100时,跳转到@8标签

  7.             call    _MySub1         ;调用MySub1函数

  8.             jmp     short @11       ;跳转到@11标签

  9.        @8:  cmp     eax,50          ;把eax寄存器的值同50进行比较

  10.             jge     short @10       ;大于等于50时,跳转到@10标签

  11.             call    _MySub2         ;调用MySub2函数

  12.             jmp     short @11       ;跳转到@11标签

  13.        @10: call    _MySub3         ;调用MySub3函数

  14.        @11: pop     ebp

  15.             ret

  16.       _MyFunc      endp

代码清单10-12中用到了三种跳转指令,分别是比较结果小或相等时跳转的jle(jump on less or equal)、大或相等时跳转的jge(jump on greater or equal)、不管结果怎样都无条件跳转的jmp。在这些跳转指令之前还有用来比较的cmp指令,比较结果被保存在了标志寄存器中。这里我们添加了注释,大家不妨顺着程序的流程看一下。虽然同C语言源代码的处理流程不完全相同,不过大家应该知道处理结果是相同的。此外,还有一点需要注意的是,eax寄存器表示的是变量a。

虽然大部分的C语言参考书中都写着“为了便于理解程序的结构,应尽量避免使用无条件分支的goto语句”,不过,在汇编语言这一领域中,如果不使用相当于C语言goto语句的jmp指令,就无法实现循环和条件分支。由此看来,关于应不应该在C语言中使用goto语句,大家没有必要这么紧张。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

windows系统-函数的条件分支实现用汇编语言解释 的相关文章

  • C++动态(显式)调用 C++ dll示例

    1 创建DLL新项目Dll1 xff0c Dll1 cpp 1 extern 34 C 34 declspec dllexport const char myfunc 2 3 return 34 hello 34 4 生成后 xff0c 将
  • 用quagga建立BGP会话

    本文将讲述使用quagga建立一个BGP会话 本次测试拓扑 假设运营商A与运营商B建立BGP对等互联来交换路由 下面是她们的AS号和IP地址范围 xff1a 运营商 A AS38372 xff0c IP段 172 16 0 0 16 xff
  • c++中堆、栈内存分配概念示例讲解

    首先来看看主要有几种程序内存分配 xff1a 一个由C C 43 43 编译程序占用内存分为以下几个部分 1 栈区 xff08 stack xff09 由编译器自动分配释放 xff0c 存放函数参数值 xff0c 局部变量值等 其操作方式类
  • winform窗体控件多,加载慢、卡顿的解决办法

    protected override CreateParams CreateParams get CreateParams cp 61 base CreateParams cp ExStyle 61 0x02000000 用双缓冲绘制窗口的
  • c# 中ToolStrip控件中button控件,显示文字和图标

    1 同时显示文字和图标 DisplayStyle 属性设为 ImageAndText DisplayStyle属性用来设置图标的显示状态为 图片 文字 图片和文字 ImageRelation 属性设为 ImageBeforeText Tex
  • C#中的线程池使用方法

    1 线程池的概念 许多应用程序使用多个线程 xff0c 但这些线程经常在休眠状态中耗费大量的时间来等待事件发生 其他线程可能进入休眠状态 xff0c 并且仅定期被唤醒以轮询更改或更新状态信息 xff0c 然后再次进入休眠状态 为了简化对这些
  • C# 读写ini配置文件demo

    INI就是扩展名为 34 INI 34 的文件 其实他本身是个文本文件 可以用记事本打工 主要存放的是用户所做的选择或系统的各种参数 INI文件其实并不是普通的文本文件 它有自己的结构 由若干段落 SECTION 组成 在每个带括号的标题下
  • C#实现实体类和XML相互转换

    一 实体类转换成XML 将实体类转换成XML需要使用XmlSerializer类的Serialize方法 xff0c 将实体类序列化 public static string XmlSerialize lt T gt T obj using
  • C# 中xml数组的序列和反序列化方法

    先来看xml lt xml version 61 39 1 0 39 gt lt root xmlns xsi 61 39 http www w3 org 2001 XMLSchema instance 39 xmlns xsd 61 39
  • c#中使用XSLT将xml文档转换为html文档方法

    c 使用XSLT将xml文档转换为html文档 使用xslt可以将xml文档转成html xff0c 如下c 函数 xff1a 需要引用下面的命名空间 xff1a using System Xml using System Xml Xsl
  • C#控件常用设计整理大全

    1 常用属性 xff08 1 xff09 Name属性 xff1a 用来获取或设置窗体的名称 xff0c 在应用程序中可通过Name属性来引用窗体 xff08 2 xff09 WindowState属性 xff1a 用来获取或设置窗体的窗口
  • C# 获取可执行文件路径的上上级目录的方法

    1 DirectoryInfo di 61 new DirectoryInfo string Format 64 34 0 34 Application StartupPath di FullName 就是你想要的 有几个就是往回退几层 2
  • npm install error code EINTEGRITY sha1

    npm install error code EINTEGRITY sha1 其他环境代码打包至另一个环境 npm install 安装依赖报错 13023 error code EINTEGRITY 13024 error sha1 Lg
  • Winform中FormClosing与FormClosed区别与使用

    FormClosing与FormClosed事件 都是关闭窗体触发的事件 xff0c 区别 FormClosing事件 是在 关闭窗体时发生 xff0c 用户可以在该事件中 取消关闭 xff0c 窗体仍然保持打开状态 因此可以在该事件中提示
  • C#实现软键盘的几个关键技术实现方法

    在嵌入式应用和一些安全软件中经常需要不通过物理键盘输入 xff0c 虽然微软提供了也一个软键盘 xff0c 但这个软件盘不能定制界面不能自动感应当前光标是否处于输入状态 xff0c 所以有时候我们还是需要自己来实现这个软键盘 本文将讲解自己
  • C#中发送消息给指定的窗口到消息循环

    public class Note 声明 API 函数 DllImport 34 User32 dll 34 EntryPoint 61 34 SendMessage 34 private static extern IntPtr Send
  • C# 获得另一个窗体句柄并发送消息(使用windows API)

    using System using System Collections Generic using System ComponentModel using System Data using System Drawing using S
  • C# SendMessage用法(调用windows API)

    函数功能 xff1a 该函数将指定的消息发送到一个或多个窗口 此函数为指定的窗口调用窗口程序 xff0c 直到窗口程序处理完消息再返回 而函数PostMessage不同 xff0c 将一个消息寄送到一个线程的消息队列后立即返回 函数原型 x
  • dos下操作mysql数据库常用命令

    1 启动数据 net start mysql 2 连接数据库 mysql u root p 3 创建数据库 create database mytest xff1b 4 删除数据库 drop database mytest xff1b 5
  • C# 中IntPtr 与 string,数组互转

    一 IntPtr 与 string互转 string str 61 34 aa 34 IntPtr init 61 Marshal StringToHGlobalAnsi str string ss 61 Marshal PtrToStri

随机推荐

  • C#中使用SendMessage进行进程通信,可发送字符串,结构体(不能发送类类型)。

    发送时只能以结构体形式发送 xff0c 类的话会提示 指定结构必须能直接复制到本机结构中 xff0c 或是具有布局信息 的错误提示 以下两种结构体示例都可以被发送 public struct A public A int a name 61
  • c#windows消息循环sendmessage实例

    DllImport 34 User32 dll 34 EntryPoint 61 34 SendMessage 34 private static extern int SendMessage IntPtr hWnd 信息发往的窗口的句柄
  • mysql 8.0.19 winx64安装及修改初始密码

    本文为大家分享了mysql 8 0 19 winx64安装教程 xff0c 供大家参考 xff0c 具体内容如下 1 下载mysql 8 0 19 winx64 1 1 进入地址 xff1a https dev mysql com down
  • ARM映像文件

    ARM映像文件 ARM中的各种源文件 xff08 包括汇编文件 xff0c C语言程序及C 43 43 程序等 xff09 经过ARM编译器编译后生成ELF xff08 Executable and linking format xff09
  • mysql安装问题汇总

    注意 xff0c xff08 1 xff09 首次安装mysql时自动生成密码后必须再手动改密码 xff0c 否则会提示修改密码 xff08 2 xff09 注意cmd命令里的字符格式 xff08 3 xff09 修改密码有些情况下不能设置
  • mysql数据库迁移到另一台电脑上

    解决办法 mysql要转换到另一台机器上面 xff0c 最重要的要考虑以下几个问题 1 数据库使用什么存储引擎 xff0c 如果是myisam的话 xff0c 可以把data目录复制移走 但如果是innodb的话 xff0c 千万不要用这种
  • winform的UI设计关键属性汇总

    1 将控件的坐标转换成屏幕的坐标 br KeyBoard StartPosition 61 FormStartPosition Manual br Point showPoint 61 ActiveTBox PointToScreen ne
  • winform中UI设计分辨率问题

    1 UI设计可以自适应或固定分辨率 xff0c 自适应需要手动写调整控件尺寸位置代码 xff1b 固定分辨率需要固定尺寸的UI资源图片 xff08 如背景图片 xff09 和固定的终端分辨率 xff08 如pc端不一致需调整分辨率为初始设计
  • C#中改变进度条(progressbar)的颜色

    改变系统自带进度条的方法就是重绘了 具体方法如下 xff1a 1 自定义控件继承自ProgressBar xff0c 如下 xff1a public class CustomProgressBar ProgressBar public Cu
  • c#中设计器中窗体释放  protected override void Dispose(bool disposing)改写解决部分窗体线程释放不彻底问题

    c 中设计器中窗体释放 protected override void Dispose bool disposing 改写解决部分窗体线程释放不彻底问题 lt summary gt 清理所有正在使用的资源 lt summary gt lt
  • 每个Form类都实现了IWin32Window接口!

    每个Form类都实现了IWin32Window接口 xff01 Form Show IWin32Window 在From1的cs文件中实例化Form2 myForm2 Show this 就可以弹出非模态的窗体 而且form2是Form1的
  • c#winform控件过多卡顿问题解决方案

    近期在项目中遇到了登录以及切换界面时 xff0c 界面不停闪烁的问题 xff0c 经过查阅发现以下方法可以成功解决该问题 将下面代码添加到窗体代码中即可 xff1a protected override CreateParams Creat
  • 子类继承父类后调用virtual函数问题(base.函数名)

    void Main SonB s 61 new SonB s Show 先调用子类的函数 xff0c 再调用基类的函数 xff08 在子类方法中base Show xff09 xff0c 一共messageBox show 了两次 publ
  • MVVM简介与运用

    前言 在介绍MVVM框架之前 xff0c 先给大家简单介绍一下MVC MVP框架 xff08 由于本博文主要讲解MVVM xff0c 所以MVC和MVP将简化介绍 xff0c 如果需要我将在以后的博文中补充进来 xff09 MVC框架 xf
  • 基于Tensorflow 三层神经网络拟合二次函数(附代码与解析)

    文章目录 前言一 隐藏层函数二 生成二次函数与损失函数 1 二次函数与画图2 损失函数三 训练数据总结 前言 刚入手深度学习 xff0c 结合这几天看的视频与内容 xff0c 将其整合成文章 提示 xff1a 以下是本篇文章正文内容 xff
  • C#中如何获取鼠标及控件的位置坐标(相对于屏幕)

    0 xff1a Control PointToScreen xff1a 将指定工作区点的位置计算成屏幕坐标 1 xff1a Control MousePosition 鼠标相对于屏左上角的坐标 xff1b 2 xff1a this Poin
  • windows系统-汇编语言的语法是“操作码+操作数”

    在汇编语言中 xff0c 1行表示对CPU的一个指令 汇编语言指令的语法结构是操作码 43 操作数 xfffc xff08 也存在只有操作码没有操作数的指令 xff09 操作码表示的是指令动作 xff0c 操作数表示的是指令对象 操作码和操
  • windows系统-程序编译过程

    系统调用和高级编程语言的移植性 操作系统的硬件控制功能 xff0c 通常是通过一些小的函数集合体的形式来提供的 这些函数及调用函数的行为统称为系统调用 xff08 system call xff09 xff0c 也就是应用对操作系统 xff
  • windows系统-汇编语言与机器码的关系

    接下来就让我们进入到本章的前半部分 在前面章节中已经多次提到 xff0c 计算机CPU能直接解释运行的只有本地代码 xff08 机器语言 xff09 程序 用C语言等编写的源代码 xff0c 需要通过各自的编译器编译后 xff0c 转换成本
  • windows系统-函数的条件分支实现用汇编语言解释

    下面让我们来看一下条件分支的实现方法 条件分支的实现方法同循环处理的实现方法类似 xff0c 使用的也是cmp指令和跳转指令 xff0c 这一点估计大家也预料到了 没错 xff0c 条件分支就是利用这些指令来实现的 不过 xff0c 为了以