爆款云主机2核4G限时秒杀,88元/年起!
查看详情

活动

天翼云最新优惠活动,涵盖免费试用,产品折扣等,助您降本增效!
热门活动
  • 618智算钜惠季 爆款云主机2核4G限时秒杀,88元/年起!
  • 免费体验DeepSeek,上天翼云息壤 NEW 新老用户均可免费体验2500万Tokens,限时两周
  • 云上钜惠 HOT 爆款云主机全场特惠,更有万元锦鲤券等你来领!
  • 算力套餐 HOT 让算力触手可及
  • 天翼云脑AOne NEW 连接、保护、办公,All-in-One!
  • 中小企业应用上云专场 产品组合下单即享折上9折起,助力企业快速上云
  • 息壤高校钜惠活动 NEW 天翼云息壤杯高校AI大赛,数款产品享受线上订购超值特惠
  • 天翼云电脑专场 HOT 移动办公新选择,爆款4核8G畅享1年3.5折起,快来抢购!
  • 天翼云奖励推广计划 加入成为云推官,推荐新用户注册下单得现金奖励
免费活动
  • 免费试用中心 HOT 多款云产品免费试用,快来开启云上之旅
  • 天翼云用户体验官 NEW 您的洞察,重塑科技边界

智算服务

打造统一的产品能力,实现算网调度、训练推理、技术架构、资源管理一体化智算服务
智算云(DeepSeek专区)
科研助手
  • 算力商城
  • 应用商城
  • 开发机
  • 并行计算
算力互联调度平台
  • 应用市场
  • 算力市场
  • 算力调度推荐
一站式智算服务平台
  • 模型广场
  • 体验中心
  • 服务接入
智算一体机
  • 智算一体机
大模型
  • DeepSeek-R1-昇腾版(671B)
  • DeepSeek-R1-英伟达版(671B)
  • DeepSeek-V3-昇腾版(671B)
  • DeepSeek-R1-Distill-Llama-70B
  • DeepSeek-R1-Distill-Qwen-32B
  • Qwen2-72B-Instruct
  • StableDiffusion-V2.1
  • TeleChat-12B

应用商城

天翼云精选行业优秀合作伙伴及千余款商品,提供一站式云上应用服务
进入甄选商城进入云市场创新解决方案
办公协同
  • WPS云文档
  • 安全邮箱
  • EMM手机管家
  • 智能商业平台
财务管理
  • 工资条
  • 税务风控云
企业应用
  • 翼信息化运维服务
  • 翼视频云归档解决方案
工业能源
  • 智慧工厂_生产流程管理解决方案
  • 智慧工地
建站工具
  • SSL证书
  • 新域名服务
网络工具
  • 翼云加速
灾备迁移
  • 云管家2.0
  • 翼备份
资源管理
  • 全栈混合云敏捷版(软件)
  • 全栈混合云敏捷版(一体机)
行业应用
  • 翼电子教室
  • 翼智慧显示一体化解决方案

合作伙伴

天翼云携手合作伙伴,共创云上生态,合作共赢
天翼云生态合作中心
  • 天翼云生态合作中心
天翼云渠道合作伙伴
  • 天翼云代理渠道合作伙伴
天翼云服务合作伙伴
  • 天翼云集成商交付能力认证
天翼云应用合作伙伴
  • 天翼云云市场合作伙伴
  • 天翼云甄选商城合作伙伴
天翼云技术合作伙伴
  • 天翼云OpenAPI中心
  • 天翼云EasyCoding平台
天翼云培训认证
  • 天翼云学堂
  • 天翼云市场商学院
天翼云合作计划
  • 云汇计划
天翼云东升计划
  • 适配中心
  • 东升计划
  • 适配互认证

开发者

开发者相关功能入口汇聚
技术社区
  • 专栏文章
  • 互动问答
  • 技术视频
资源与工具
  • OpenAPI中心
开放能力
  • EasyCoding敏捷开发平台
培训与认证
  • 天翼云学堂
  • 天翼云认证
魔乐社区
  • 魔乐社区

支持与服务

为您提供全方位支持与服务,全流程技术保障,助您轻松上云,安全无忧
文档与工具
  • 文档中心
  • 新手上云
  • 自助服务
  • OpenAPI中心
定价
  • 价格计算器
  • 定价策略
基础服务
  • 售前咨询
  • 在线支持
  • 在线支持
  • 工单服务
  • 建议与反馈
  • 用户体验官
  • 服务保障
  • 客户公告
  • 会员中心
增值服务
  • 红心服务
  • 首保服务
  • 客户支持计划
  • 专家技术服务
  • 备案管家

了解天翼云

天翼云秉承央企使命,致力于成为数字经济主力军,投身科技强国伟大事业,为用户提供安全、普惠云服务
品牌介绍
  • 关于天翼云
  • 智算云
  • 天翼云4.0
  • 新闻资讯
  • 天翼云APP
基础设施
  • 全球基础设施
  • 信任中心
最佳实践
  • 精选案例
  • 超级探访
  • 云杂志
  • 分析师和白皮书
  • 天翼云·创新直播间
市场活动
  • 2025智能云生态大会
  • 2024智算云生态大会
  • 2023云生态大会
  • 2022云生态大会
  • 天翼云中国行
天翼云
  • 活动
  • 智算服务
  • 产品
  • 解决方案
  • 应用商城
  • 合作伙伴
  • 开发者
  • 支持与服务
  • 了解天翼云
      • 文档
      • 控制中心
      • 备案
      • 管理中心

      linux平台上的2个ASM汇编小程序(helloworld, 返回最大值)

      首页 知识中心 软件开发 文章详情页

      linux平台上的2个ASM汇编小程序(helloworld, 返回最大值)

      2024-05-31 07:27:29 阅读次数:46

      linux

      为了学习ASM,看了2个小例子。

      程序一:helloworld

      hello.s内容:

      .data
      
      msg:
          .ascii "hello world asm!\n"
          len = . -msg
      
      .text 
      .global _start
      
      
      _start:
          movl $len, %edx
          movl $msg, %ecx
          movl $1 , %ebx #1代表 文件描述符
          movl $4, %eax  #4代表 调用write 
          int $0x80
      
          movl $0, %ebx
          movl $1, %eax  # 1代表 调用 _exit
          int $0x80
      
      

      编译运行: 

      as hello.s -o hello.o
      ld hello.o -o hello
      ./hello

      输出: 

      pcl@V3:~/work/test/asm$ ./hello
      hello world asm!

      这段汇编相当于:

      1

      2

      3

      4

      5

      6

      7

      8

      9

      #include <unistd.h>

      char msg[14] = "Hello,world!\n";

      #define len 14

       

      int main(void)

      {

          write(1, msg, len);

          _exit(0);

      }

          .data段有一个标号msg,代表字符串“Hello,world!\n”的首地址,相当于C程序的一个全局变量。在汇编指示.ascii定义的字符串末尾没有隐含的‘\0’。汇编程序中的len代表一个常量,它的值由当前地址减去符号msg所代表的地址得到,换句话说就是字符串“Hello,world!\n”的长度。现在解释一下这行代码中的.,汇编器总是从前到后把汇编代码转换成目标文件,在这个过程中维护一个地址计数器,当处理到每个段的开头时把地址计数器置成0,然后每处理一条汇编指示或指令就把地址计数器增加相应的字节数,在汇编程序中用.可以取出当前地址计数器的值,是一个常量。

          在_start中调了两个系统调用,第一个是write系统调用,第二个是以前讲过的_exit系统调用。在调write系统调用时,eax寄存器保存着write的系统调用号4,ebx、ecx、edx寄存器分别保存着write系统调用需要三个参数。ebx保存着文件描述符,进程中每个打开的文件都用一个编号来标识,成为文件描述符,文件描述符1表示标准输出,对应的C标准I/O库的stdout。ecx保存着输出缓冲区的首地址。edx保存着输出的字节数。write系统调用把从msg开始的len个字节写到标准输出。

          C代码中的write函数是系统调用的包装函数,其内部实现就是把传进来的三个参数分别赋给ebx、ecx、edx寄存器,然后执行movl $4,%eax和int $0x80两指令。这个函数不可能完全用C代码写,因为任何C代码都不会编译生成int指令,所以这个函数有可能完全用汇编写的,也有可能是C用内联汇编写的,甚至是一个宏定义。_exite函数也是如此。

      程序二:计算最大值并返回


      max.s内容:

      #PURPOSE: This program finds the maximum number of a
      # set of data items.
      #
      #VARIABLES: The registers have the following uses:
      #
      # %edi - Holds the index of the data item being examined
      # %ebx - Largest data item found
      # %eax - Current data item
      #
      # The following memory locations are used:
      #
      # data_items - contains the item data. A 0 is used
      # to terminate the data
      # 
      
      .section .data
      data_items: #These are the data items 
      .long 3,67,34,222,45,75,54,34,44,33,22,11,66,0
      
      .section .text 
      .globl _start
      
      _start: movl $0, %edi # move 0 into the index register 
      movl data_items(,%edi,4), %eax  # load the first byte of data 
      movl %eax, %ebx  # since this is the first item, %eax is 
      # the biggest
      
      start_loop: # start loop 
      cmpl $0, %eax  # check to see if we've hit the end 
      je loop_exit 
      
      incl %edi  # load next value 
      movl data_items(,%edi,4), %eax 
      cmpl %ebx, %eax # compare values 
      jle start_loop # jump to loop beginning if the new 
      # one isn't bigger 
      movl %eax, %ebx  # move the value as the largest 
      jmp start_loop # jump to loop beginning
      
      
      loop_exit: 
      # %ebx is the status code for the _exit system call 
      # and it already has the maximum number 
      movl $1, %eax       #1 is the _exit() syscall
      int $0x80
      
      

      编译运行:

      as max.s -o max.o
      ld max.o -o max
      ./max
      echo $?

       输出222 即最大值

      解释:

      这个程序在一组数中找到一个最大的数,并把它作为程序的退出状态。这段数在.data段给出:

      data_items:
      .long 3,67,34,222,45,75,54,34,44,33,22,11,66,0

       .long指示声明一组数,每个数32位,相当于C数组。数组开头有个标号data_items,汇编器会把数组的首地址作为data_items符号所代表的地址,data_items类似于C中的数组名。data_items这个标号没有.globl声明是因为它只在这个汇编程序内部使用,链接器不需要知道这个名字的存在。除了.long之外常用的声明:

      • .byte,也是声明一组数,每个数8位
      • .ascii,例: .ascii "Hello World",声明了11个数,取值为相应字符的ASCII码。和C语言不同的是这样声明的字符串末尾是没有'\0'字符的。

      data_items数组的最后一个数是0,我们在一个循环中依次比较每个数,碰到0的时候就终止循环。在这个循环中:

      • edi寄存器保存数组中的当前位置,每次比较完一个数就把edi的值加1,指向数组中的下一个数。
      • ebx寄存器保存到目前为止找打的最大值,如果发现有更大的数就更新ebx的值。
      • eax寄存器保存当前要比较的数,每次更新edi之后,就把下一个数读到eax中。
      _start:
      movl $0, %edi

      初始化edi,指向数组的第0个元素。

      movl data_items(,%edi,4), %eax

      这条指令把数组的第0个元素传送到eax寄存器中。data_items是数组的首地址,edi的值是数组的下标,4表示数组的每个元素占4字节,那么数组中第edi个元素的地址应该是data_items+edi*4。从这个地址读数据,写成指令就是上面那样。

      movl %eax, %ebx

      ebx的初始值也是数组的第0个元素。

      下面进入一个循环,在循环的开头用标号start_loop表示,循环的末尾之后用标号loop_exit表示。

      start_loop:
      cmpl $0, %eax
      je loop_exit

      比较eax的值是不是0,如果是0就说明到了数组末尾了,就要跳出循环。cmpl指令将两个操作数相减,但计算结果并不保存,只是根据计算结果改变eflags寄存器中的标志位。如果两个操作数相等,则计算结果为0,eflags中的ZF位置1。je是一个条件跳转指令,它检查eflags中的ZF位,ZF位为1则发生跳转,ZF位为0则不跳转继续执行下一条指令。(条件跳转指令和比较指令是配合使用的)je的e就表示equal。

      incl %edi movl data_items(,%edi,4), %eax

      将edi的值加1,把数组中的下一个数组传送到eax寄存器中。

      cmpl %ebx, %eax jle start_loop

      把当前数组元素eax和目前为止找到的最大值ebx做比较,如果前者小于等于后者,则最大值没有变,跳转到循环开头比较下一个数,否则继续执行下一条指令。jle也是一个条件跳转指令,le表示less than or equal。

      movl %eax, %ebx jmp start_loop

      更新了最大值ebx然后跳转到循环开头继续比较下一个数。jmp是一个无条件跳转指令,什么条件也不判断直接跳转。loop_exit标号后面的指令用_exit系统调用来退出程序。

      版权声明:本文内容来自第三方投稿或授权转载,原文地址:https://blog.csdn.net/v6543210/article/details/120655893,作者:路边闲人2,版权归原作者所有。本网站转在其作品的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如因作品内容、版权等问题需要同本网站联系,请发邮件至ctyunbbs@chinatelecom.cn沟通。

      上一篇:chatgpt 使用技巧-画流程图

      下一篇:C#中的序列化和反序列化

      相关文章

      2025-05-19 09:04:53

      查看RISC-V版本的gcc中默认定义的宏

      查看RISC-V版本的gcc中默认定义的宏

      2025-05-19 09:04:53
      c++ , linux
      2025-04-14 08:48:01

      expdp备份集直接导出到asm磁盘组

      expdp备份集直接导出到asm磁盘组

      2025-04-14 08:48:01
      expdp , 备份 , 导出 , 磁盘
      2025-04-01 10:28:37

      小课2:筛选信息命令

      小课2:筛选信息命令

      2025-04-01 10:28:37
      bash , linux , 升序 , 服务器 , 运维
      2025-03-26 09:31:12

      shell脚本实现查询代码中定义了多少宏的方法

      shell脚本实现查询代码中定义了多少宏的方法

      2025-03-26 09:31:12
      bash , linux , 运维
      2025-03-06 09:15:26

      spring cloud系统安装涉及的技术说明

      spring cloud系统安装涉及的技术说明

      2025-03-06 09:15:26
      docker , linux , 安装 , 技术
      2025-03-05 09:24:43

      【Python】使用numpy库实现Tic-Tac-Toe井字棋

      【Python】使用numpy库实现Tic-Tac-Toe井字棋

      2025-03-05 09:24:43
      linux , 右键 , 安装 , 打开 , 输入
      2025-02-10 08:53:59

      【linux】linux C 程序 注册信号处理函数

      【linux】linux C 程序 注册信号处理函数  

      2025-02-10 08:53:59
      linux , 函数 , 注册 , 程序
      2025-01-17 09:07:21

      课时3:处理信息命令

      课时3:处理信息命令

      2025-01-17 09:07:21
      linux , shell , 数据库 , 服务器 , 运维
      2024-12-27 08:03:29

      rac环境监听状态不显示asm信息

      rac环境监听状态不显示asm信息

      2024-12-27 08:03:29
      rac , 信息 , 状态 , 监听
      2024-12-16 08:18:54

      搭建RAC时报错Cannot verify the shared state for device /dev/asm-diskd due to Universally Unique Identifie

      搭建RAC时报错Cannot verify the shared state for device /dev/asm-diskd due to Universally Unique Identifie

      2024-12-16 08:18:54
      state
      查看更多
      推荐标签

      作者介绍

      天翼云小翼
      天翼云用户

      文章

      33561

      阅读量

      5266159

      查看更多

      最新文章

      shell脚本实现查询代码中定义了多少宏的方法

      2025-03-26 09:31:12

      【Python】使用numpy库实现Tic-Tac-Toe井字棋

      2025-03-05 09:24:43

      【linux】linux C 程序 注册信号处理函数

      2025-02-10 08:53:59

      [接口测试 - http.client篇] 16 基于http.client之POM实战一下

      2024-09-25 10:15:32

      创建你的第一个webdriver python代码

      2024-09-25 10:15:15

      [Java基础] StringBuffer 和 StringBuilder 类应用及源码分析

      2024-09-25 10:14:09

      查看更多

      热门文章

      程序员之路:Linux压缩命令

      2023-03-21 02:52:11

      Linux下查看进程线程数的方法

      2023-05-15 10:04:01

      Python编程:paramiko模块远程登录

      2023-02-21 08:02:44

      基于jenkins和jmeter实现接口自动化过程

      2023-06-08 06:18:44

      简单的内核编译安装图解

      2023-03-16 07:49:58

      linux网络编程初步

      2023-05-10 06:17:58

      查看更多

      热门标签

      java Java python 编程开发 代码 开发语言 算法 线程 Python html 数组 C++ 元素 javascript c++
      查看更多

      相关产品

      弹性云主机

      随时自助获取、弹性伸缩的云服务器资源

      天翼云电脑(公众版)

      便捷、安全、高效的云电脑服务

      对象存储

      高品质、低成本的云上存储服务

      云硬盘

      为云上计算资源提供持久性块存储

      查看更多

      随机文章

      一个寄存器的bit2 bit3位由10修改成11,C示例

      linux下载软件包

      C++系列一: C++简介

      nginx限速限流限并发防止攻击

      Linux之ClamAV杀毒软件YUM安装和使用

      Linux bash shell中将数组按编号规则输出

      • 7*24小时售后
      • 无忧退款
      • 免费备案
      • 专家服务
      售前咨询热线
      400-810-9889转1
      关注天翼云
      • 旗舰店
      • 天翼云APP
      • 天翼云微信公众号
      服务与支持
      • 备案中心
      • 售前咨询
      • 智能客服
      • 自助服务
      • 工单管理
      • 客户公告
      • 涉诈举报
      账户管理
      • 管理中心
      • 订单管理
      • 余额管理
      • 发票管理
      • 充值汇款
      • 续费管理
      快速入口
      • 天翼云旗舰店
      • 文档中心
      • 最新活动
      • 免费试用
      • 信任中心
      • 天翼云学堂
      云网生态
      • 甄选商城
      • 渠道合作
      • 云市场合作
      了解天翼云
      • 关于天翼云
      • 天翼云APP
      • 服务案例
      • 新闻资讯
      • 联系我们
      热门产品
      • 云电脑
      • 弹性云主机
      • 云电脑政企版
      • 天翼云手机
      • 云数据库
      • 对象存储
      • 云硬盘
      • Web应用防火墙
      • 服务器安全卫士
      • CDN加速
      热门推荐
      • 云服务备份
      • 边缘安全加速平台
      • 全站加速
      • 安全加速
      • 云服务器
      • 云主机
      • 智能边缘云
      • 应用编排服务
      • 微服务引擎
      • 共享流量包
      更多推荐
      • web应用防火墙
      • 密钥管理
      • 等保咨询
      • 安全专区
      • 应用运维管理
      • 云日志服务
      • 文档数据库服务
      • 云搜索服务
      • 数据湖探索
      • 数据仓库服务
      友情链接
      • 中国电信集团
      • 189邮箱
      • 天翼企业云盘
      • 天翼云盘
      ©2025 天翼云科技有限公司版权所有 增值电信业务经营许可证A2.B1.B2-20090001
      公司地址:北京市东城区青龙胡同甲1号、3号2幢2层205-32室
      • 用户协议
      • 隐私政策
      • 个人信息保护
      • 法律声明
      备案 京公网安备11010802043424号 京ICP备 2021034386号