第7章 程序流程控制 - 条件分支
汇编语言是一种低级编程语言,它与特定计算机架构的机器码有着直接对应关系。条件分支是程序流程控制的一部分,允许根据某些条件来决定执行哪一段代码。在汇编中,这通常通过比较指令和跳转指令来实现。
以下是一些经典的汇编语言源代码示例,用于展示条件分支的工作原理。请注意,不同的处理器架构有不同的汇编语法和指令集,下面的例子使用的是类似于x86架构的汇编语法。
示例 1: 简单的条件分支
section .datanum1 db 5 ; 定义一个字节变量num1,并初始化为5num2 db 10 ; 定义一个字节变量num2,并初始化为10section .textglobal _start_start:mov al, [num1] ; 将num1加载到寄存器al中cmp al, [num2] ; 比较al中的值和num2jg label_greater ; 如果num1 > num2,则跳转到label_greaterjl label_less ; 如果num1 < num2,则跳转到label_lesslabel_equal:; 执行当num1 == num2时的代码jmp end ; 跳转到end结束程序label_greater:; 执行当num1 > num2时的代码jmp end ; 跳转到end结束程序label_less:; 执行当num1 < num2时的代码jmp end ; 跳转到end结束程序end:; 程序结束处理
示例 2: 使用循环和条件分支打印数字(简化版)
section .datacounter db 0 ; 初始化计数器为0section .textglobal _start_start:inc byte [counter] ; 计数器加1cmp byte [counter], 10 ; 比较计数器是否达到10jl _start ; 如果计数器小于10,继续循环; 当计数器达到10后,可以在这里添加打印逻辑或其他代码exit:; 程序退出处理
示例 3: 条件分支结合函数调用
section .textglobal _start_start:call check_value ; 调用子程序check_value; 继续执行其他代码或程序结束check_value:cmp eax, 0 ; 假设eax中有一个需要检查的值je is_zero ; 如果eax等于0,跳转到is_zerojg is_positive ; 如果eax大于0,跳转到is_positivejl is_negative ; 如果eax小于0,跳转到is_negativeis_zero:; eax等于0时执行的代码ret ; 返回调用者is_positive:; eax大于0时执行的代码ret ; 返回调用者is_negative:; eax小于0时执行的代码ret ; 返回调用者
这些例子展示了如何使用cmp(比较)指令与各种跳转指令(如jg、jl、je等)来实现条件分支。cmp指令实际上会执行减法但不存储结果,只影响标志位;然后根据标志位的状态,选择性地执行跳转指令。这样就可以基于比较的结果来改变程序的执行路径。
请记住,在实际编写汇编代码时,你需要考虑具体的目标平台和操作系统,因为它们可能会影响可用的指令和系统调用接口。
当然,我们可以继续深入探讨条件分支在汇编语言中的应用,并且加入一些更复杂的例子,比如嵌套的条件结构、结合循环和条件分支的使用,以及如何处理多条件分支。
示例 4: 嵌套条件分支
section .datavalue db 7 ; 定义一个字节变量value,并初始化为7section .textglobal _start_start:mov al, [value] ; 将value加载到寄存器al中cmp al, 5 ; 比较al中的值是否等于5je equal_to_five ; 如果等于5,跳转到equal_to_fivecmp al, 10 ; 再比较al中的值是否等于10je equal_to_ten ; 如果等于10,跳转到equal_to_ten; 如果上述两个条件都不满足,则执行以下代码jmp not_five_or_tenequal_to_five:; 执行当value等于5时的代码jmp end ; 跳转到end结束程序equal_to_ten:; 执行当value等于10时的代码jmp end ; 跳转到end结束程序not_five_or_ten:; 执行当value既不等于5也不等于10时的代码end:; 程序结束处理
示例 5: 结合循环与条件分支
这个例子展示了一个简单的“猜数字”游戏逻辑,用户需要猜测一个预设的数字。为了简化,假设输入输出已经由其他部分处理。
section .datasecret db 42 ; 预设的秘密数字是42guess db 0 ; 用户的猜测,初始为0section .textglobal _start_start:
guess_loop:; 获取用户的猜测并存储到guess变量(此处省略获取输入的代码)mov al, [guess] ; 将用户的猜测加载到寄存器al中cmp al, [secret] ; 比较用户的猜测和秘密数字je correct_guess ; 如果相等,跳转到correct_guessjl too_low ; 如果小于秘密数字,跳转到too_lowjg too_high ; 如果大于秘密数字,跳转到too_hightoo_low:; 提示用户猜得过低jmp guess_loop ; 回到循环开始再次猜测too_high:; 提示用户猜得过高jmp guess_loop ; 回到循环开始再次猜测correct_guess:; 当用户猜对了,给出胜利提示jmp end ; 跳转到end结束程序end:; 程序结束处理
示例 6: 使用switch-case类似的多条件分支
虽然汇编语言没有直接的switch-case语句,但是可以通过一系列条件跳转来模拟这种结构。下面是一个基于多个条件的分支示例:
section .dataoption db 3 ; 假设option是一个用户选择的选项section .textglobal _start_start:mov al, [option] ; 将option加载到寄存器al中cmp al, 1 ; 比较option是否等于1je case_1 ; 如果等于1,跳转到case_1cmp al, 2 ; 比较option是否等于2je case_2 ; 如果等于2,跳转到case_2cmp al, 3 ; 比较option是否等于3je case_3 ; 如果等于3,跳转到case_3; 如果option不是1、2或3,则默认执行以下代码jmp default_casecase_1:; 执行当option等于1时的代码jmp end ; 跳转到end结束程序case_2:; 执行当option等于2时的代码jmp end ; 跳转到end结束程序case_3:; 执行当option等于3时的代码jmp end ; 跳转到end结束程序default_case:; 执行当option不是1、2或3时的代码end:; 程序结束处理
这些例子进一步展示了如何在汇编语言中实现复杂的条件分支逻辑。实际编写时,你可能还需要考虑错误处理、边界情况和其他特定于应用程序的需求。此外,汇编语言的编程通常依赖于对底层硬件的详细了解,因此熟悉目标平台的架构是非常重要的。
让我们继续深入探讨汇编语言中条件分支的应用,并介绍一些更高级的概念和技术,如使用位操作进行条件判断、利用宏定义简化代码编写、以及优化条件分支以提高性能。
示例 7: 使用位操作进行条件判断
在某些情况下,我们可以通过检查一个数的特定位来做出决策。例如,检查一个数是否为偶数(即最右边的一位是否为0),或者通过掩码和位移操作来解析复杂的标志集合。
section .datanum db 14 ; 定义一个字节变量num,并初始化为14section .textglobal _start_start:mov al, [num] ; 将num加载到寄存器al中and al, 1 ; 与1做按位与运算,检查最低位是否为1jz is_even ; 如果结果为0,则是偶数,跳转到is_evenjmp is_odd ; 否则,是奇数,跳转到is_oddis_even:; 执行当num是偶数时的代码jmp end ; 跳转到end结束程序is_odd:; 执行当num是奇数时的代码jmp end ; 跳转到end结束程序end:; 程序结束处理
示例 8: 利用宏定义简化代码编写
宏定义可以帮助减少重复代码,使得程序更易读和维护。下面的例子展示了如何使用宏来简化条件分支逻辑:
%macro check_value_and_branch 2cmp byte [%1], %2je equal_%1_to_%2jl less_than_%1_to_%2jg greater_than_%1_to_%2
%endmacrosection .datavalue db 5 ; 定义一个字节变量value,并初始化为5section .textglobal _start_start:check_value_and_branch value, 10equal_value_to_10:; 当value等于10时执行的代码jmp endless_than_value_to_10:; 当value小于10时执行的代码jmp endgreater_than_value_to_10:; 当value大于10时执行的代码jmp endend:; 程序结束处理
示例 9: 优化条件分支以提高性能
在汇编编程中,理解CPU的预测机制可以有助于写出更高效的代码。尽量避免深度嵌套的条件结构,因为这可能导致大量的分支预测失败,进而降低性能。此外,可以考虑将最常发生的路径放在分支结构的顶部,以增加预测成功的概率。
section .datafreq_values db 3, 5, 7, 10 ; 频率最高的值排在前面section .textglobal _start_start:mov al, [freq_values] ; 假设我们要比较的值是从freq_values开始的cmp al, 3 ; 比较最常见的值je most_frequent ; 如果相等,立即处理最常见的分支cmp al, 5 ; 比较下一个常见的值je second_most_frequentcmp al, 7 ; 继续比较...cmp al, 10 ; 最后比较最少见的值je least_frequentmost_frequent:; 处理最常见的值jmp endsecond_most_frequent:; 处理第二常见的值jmp endleast_frequent:; 处理最少见的值jmp endend:; 程序结束处理
示例 10: 使用表驱动法实现多条件分支
对于具有多个可能选项的情况,可以使用查找表(Lookup Table)或跳转表(Jump Table)来替代一系列的cmp和跳转指令。这种方法不仅使代码更加简洁,而且通常能提供更好的性能。
section .datajump_table dd case_1, case_2, case_3, default_case ; 跳转表option db 2 ; 用户选择的选项section .textglobal _start_start:movzx eax, byte [option] ; 将option扩展为32位并移动到eaxdec eax ; 因为数组索引从0开始,所以减1jmp [jump_table + eax*4] ; 根据option的值跳转到相应的地址case_1:; 执行当option等于1时的代码jmp endcase_2:; 执行当option等于2时的代码jmp endcase_3:; 执行当option等于3时的代码jmp enddefault_case:; 执行默认情况下的代码end:; 程序结束处理
以上示例说明了如何在汇编语言中实现更复杂和高效的条件分支逻辑。通过这些技术,你可以编写出既强大又高效的程序。不过,请记住,实际应用中需要根据具体的需求和平台特性来调整代码。
相关文章:
第7章 程序流程控制 - 条件分支
汇编语言是一种低级编程语言,它与特定计算机架构的机器码有着直接对应关系。条件分支是程序流程控制的一部分,允许根据某些条件来决定执行哪一段代码。在汇编中,这通常通过比较指令和跳转指令来实现。 以下是一些经典的汇编语言源代码示例&a…...
Edge如何获得纯净的启动界面
启动Edge会出现快速链接,推广链接,网站导航,显示小组件,显示信息提要,背景 ●复杂页面 ●精简页面 点击页面设置按钮 关闭快速链接 关闭网站导航 关闭小组件 关闭信息提要 关闭背景 关闭天气提示 精简页面看起来十分舒…...
gitlab的搭建及使用
1、环境准备 服务器准备 CentOS Linux release 7.9.2009 (Core),内存至少4G。 修改主机名和配置ip地址 hostnamectl set-hostname <hostname> 关闭主机的防火墙 # 关闭防火墙 systemctl stop firewalld #临时关闭防火墙 systemctl disable firewalld …...
如何逐步操作vCenter修改DNS服务器?
在vSphere 7中有一个新功能,它允许管理员更改vCenter Server Appliance的FQDN和IP。因此本文将介绍如何轻松让vCenter修改DNS服务器。 vCenter修改DNS以及修改vCenter IP地址 与在部署 vCenter Server Appliance 后,您可以根据需要修改其 DNS 设置和 IP…...
XIAO ESP32 S3网络摄像头——2视频获取
本文主要是使用XIAO Esp32 S3制作网络摄像头的第2步,获取摄像头图像。 1、效果如下: 2、所需硬件 3、代码实现 3.1硬件代码: #include "WiFi.h" #include "WiFiClient.h" #include "esp_camera.h" #include "camera_pins.h"// 设…...
使用JMeter对Linux生产服务器进行压力测试
安装 JMeter wget https://downloads.apache.org/jmeter/binaries/apache-jmeter-5.4.1.tgz tar -xzf apache-jmeter-5.4.1.tgz cd apache-jmeter-5.4.1创建 JMeter 脚本 设置中文 选择Options—>Choose Language—>选择其他语言(例如:Chinese&am…...
spring boot 异步线程池的使用
创建Spring Boot项目 首先,你需要创建一个Spring Boot项目。你可以使用Spring Initializr(https://start.spring.io/)来快速生成项目结构。 添加异步支持依赖 在你的pom.xml文件中,确保你已经添加了Spring Boot的starter依赖&…...
风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注
风力涡轮机缺陷检测数据集,86.6%准确识别率,11921张图片,支持yolo,PASICAL VOC XML,COCO JSON格式的标注 数据集下载 yolov11: https://download.csdn.net/download/pbymw8iwm/90206849 yolov…...
深入浅出梯度下降与反向传播
文章目录 1. 前言2. 基本概念2.1 一元函数的导数2.2 偏导数2.3 方向导数2.4 梯度2.5 均方误差 3. 梯度下降3.1 梯度下降的公式3.2 梯度下降的类型(优化器) 4. 反向传播4.1 反向传播的基本步骤4.2 反向传播的数学推导 5. 实战5.1 手动求导5.2 自动求导5.3…...
【电机控制】基于STC8H1K28的六步换向——方波驱动(硬件篇)
【电机控制】基于STC8H1K28的六步换向——方波驱动(硬件篇) 文章目录 [TOC](文章目录) 前言一、硬件原理图1. MCU主控电路2. LDO电路3. 驱动电路4. 过零检测电路 二、3D图三、参考资料总结 前言 【电机控制】STC8H无感方波驱动—反电动势过零检测六步换向…...
手搓一个ChatUI需要分几步
只关注项目代码的同学可以直接跳转目录中的正文部分,查看项目仓库和功能介绍。 引言 Chatbot的UI界面设计,是和传统软件不同的:都是当面一个简洁的对话框,框里预备着热乎的工具,可以随时更新。 像我这样做工的牛马&a…...
2024年年度总结
前言 前一段时间,看到网上有人发类似于年度总结的东西,我想我也可以写一个,今年的日记也是从开头一直贯彻到了结尾 回忆起一年的事情还是有些困难 一月 回忆起有点困难,原因是我的日记大部分都是记录我当天地感想与情绪&#x…...
labelme2yolov8-seg 草稿()
简介: 最近做实例分割分割,使用Labelme生成json格式标签后,需要转换为txt标签,才能供YOLO进行训练。 在参看b站,github后,发现GitHub有相关项目:lableme2yolo 一个是ultralyics官方的JSON2YO…...
开源简史与概览
Think 1.论述“自由软件”与“开源软件”的区别与联系? 2.GitHub Trending 是一个能够快速找到有趣的新项目的地方;而 OpenLeaderboard 也是一个能够发现有趣而有影响力项目的地方。尝试从这两个网站中找到感兴趣的若干项目,挖掘并分析出上…...
充电桩语音提示芯片方案-支持平台自定义语音NV128H让充电更便捷
随着工业化与城市化进程的加速推进,传统燃油汽车的数量急剧攀升,这直接导致了石油资源的过度开采与消耗。石油,作为不可再生的化石燃料,其储量日益枯竭,价格波动频繁,给全球能源安全带来了前所未有的挑战。…...
277-基于八路256Ksps 24bit AD生物电震动检测FMC子卡
一、板卡概述 板卡基于AD7768 AD芯片设计的八路低速采集的FMC 子卡,支持直流耦合,产品应用于生物电、脑电波、声音,震动等信号采集。 二、板卡参数及性能 板卡功能 参数 内容 ADC 芯片型号 AD7768 路数 8路ADC, 采样率 2…...
【电路理论四】正弦电流电路
正弦电流 正弦量是随时间按正弦规律变动的电路变量。 随时间按正弦规律变动的电流称为正弦电流。 正弦电流的瞬时值表达式: 称为正弦电流的三要素。 分别为振幅/幅值,角频率,初相。 幅值为正弦电流的最大值,恒为正。 为正弦电…...
【PyCharm】如何把本地整个项目同步到服务器?
在PyCharm中,您可以使用部署功能将项目同步到服务器。以下是步骤和示例配置: 打开PyCharm,选择您的项目。 点击菜单栏的 “File” -> “Settings” -> “Build, Execution, Deployment”。 在左侧菜单中,选择 “Deployme…...
露营小程序搭建有哪些步骤?小程序里面可以找个露营搭子
露营不仅仅是走进大自然的旅程,它也成为了一种社交和体验式的活动。随着小程序的普及,露营活动也越来越多地开始在线上开展。通过搭建一个露营小程序,商家不仅可以为用户提供更多的露营选择,还可以帮助他们找到合适的露营搭子。那…...
SOLID-开闭原则
单一职责原则:https://blog.csdn.net/dmk877/article/details/143447010 在前面我们学习了单一职责原则,今天来一起学习一下SOLID原则中的开闭原则(Open-Closed Principle, OCP) 通过本篇博客你将学到到以下内容 ①什么是开闭原则 ②如何实现开闭原则 ③…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
