Linux汇编实例讲解(二)——求最大值

这篇文章讲解的是使用汇编语言找出一组数字的最大值,主要涉及的知识点有data段、循环等。

# 目的:在程序中找出最大的数字
#
# 变量:寄存器的用途定义
#       %edi - 保存正在检查的数据项索引
#       %ebx - 当前已找到的最大项
#       %eax - 当前数据
#
# 使用以下内存位置:
#       data_items - 包含数据项
#                    0表示结束
#

.section .data

data_items:
.long 3, 68, 12, 37, 198, 10, 1, 4, 26, 255, 11, 22, 33, 44, 0

.section .text

.globl _start

_start:
        movl    $0, %edi                   #将0移入索引寄存器
        movl    data_items(,%edi,4), %eax  #加载数据项的第一个字节
        movl    %eax, %ebx                 #由于是第一项,%eax就是最大值

start_loop:
        cmpl    $0, %eax
        je      loop_exit
        incl    %edi
        movl    data_items(,%edi,4), %eax
        cmpl    %ebx, %eax
        jle     start_loop

        movl    %eax, %ebx
        jmp     start_loop

loop_exit:
        movl    $1, %eax
        int     $0x80

代码详解:

1. 代码的执行结果为:

echo $?输出的结果为255是因为在基数数组为:

3, 68, 12, 37, 198, 10, 1, 4, 26, 255, 11, 22, 33, 44

在这个数组中,最大的数字为255,如果将255去掉或者换成别的数字,则会输出别值,例如我们将值换成168,则”echo $?“应该输出198:

程序输出的结果为:

2.下面从头开始分析代码的结构:

(1)以#开头的为注释,这里不再解释

(2)

.section .data

data_items:
.long 3, 68, 12, 37, 198, 10, 1, 4, 26, 255, 11, 22, 33, 44, 0

该段代码定义了程序所要使用的数据,其中date_items是一个标签,到时候其会被实际的内存地址所替代。

.long 定了了数据的类型,在32位系统中long类型的数据占4字节(byte)。long后面跟的是实际要使用的数字。

汇编语言中主要的数据类型:

.byte 每个字节类型的数字占用一个存储位置,数字范围0~255

.int 每个整型数字(这种类型与int指令不同)占用两个存储位置,数字范围为0~65535.

.ascii 该指令用于将字符串输入内存。每个字符占用一个存储位置。

(3)

_start:
        movl    $0, %edi                   #将0移入索引寄存器
        movl    data_items(,%edi,4), %eax  #加载数据项的第一个字节
        movl    %eax, %ebx                 #由于是第一项,%eax就是最大值

movl    data_items(,%edi,4), %eax这句是加载数据项的第一个,因为%edi寄存器中的值为0,则实际地址是data_items + %edi * 4--> data_items + 0;

(4)

start_loop:
        cmpl    $0, %eax
        je      loop_exit
        incl    %edi
        movl    data_items(,%edi,4), %eax
        cmpl    %ebx, %eax
        jle     start_loop

        movl    %eax, %ebx
        jmp     start_loop

该段代码为循环控制结构。其中start_loop只是一个标签,标记循环指令开始的位置。语句“cmpl    $0, %eax”判断寄存器%eax中的值是否为0,如果为0则直接跳转到loop_exit指令处。如果不为0,则继续往下执行。这是因为我们使用0作为所有数字的结束标志,当然也可以换成别的。语句“incl    %edi”表示将%edi寄存器中的值加1,这样在下一指令(“movl    data_items(,%edi,4), %eax”)中可以得到下一个数字的地址,语句“cmpl    %ebx,
%eax”用来比较两个数字的大小,下一条语句“jle     start_loop”则表示如果上一个比较结果是%eax中的值小于或等于%ebx中的值,则程序跳转到start_loop处,即程序循环的开始,如果不是小于或等于的情况,则表示%eax中的数字大于%ebx中的数字,需要将%eax中的值放到%ebx寄存器中,因为最大值会作为程序退出时的状态码返回。

时间: 2024-08-02 15:44:39

Linux汇编实例讲解(二)——求最大值的相关文章

Linux汇编实例讲解(一)

我们使用的平台是Linux系统,具体为CentOS-64位版.下面是第一个汇编程序的源码: # 目的:退出Linux内核并返回一个简单的状态码 # # 输入:无 # # 输出:控制台上没有输出,可以用echo $?来查看状态码 # # 变量: # %eax 保存系统调用号 # %ebx 保存返回状态 # .section .data .section .text .globl _start _start: movl $1, %eax #这是用于退出程序的Linux内核命令号(系统调用) movl

编程总结二 求最大值及其下标

7-2 求最大值及其下标 (20 分) 本题要求编写程序,找出给定的n个数中的最大值及其对应的最小下标(下标从0开始). 输入格式: 输入在第一行中给出一个正整数n(1<n≤10).第二行输入n个整数,用空格分开. 输出格式: 在一行中输出最大值及最大值的最小下标,中间用一个空格分开. 输入样例: 6 2 8 10 1 9 10 输出样例: 10 2 1.代码 #include <stdio.h> int main (void) { int n,i,x=0,y=0; int a[10];

jQuery插件ImgAreaSelect 实例讲解二

在上一篇随笔http://www.cnblogs.com/chenguanai/p/6883401.html中,已经了解了头像的上传预览和裁剪功能:那么这次就再看一下imgareaselect的裁剪功能~~~ 有时候,我们裁剪某一区域时,分别会有大中小三个头像显示着~~~也就是如下图所示,当在右边的原图选择时,左边会分别显示大中小三个头像,便于用户选择~~~ 第一步:先引入插件和js包 <link rel="stylesheet" type="text/css"

实例讲解Nginx下的rewrite规则 来源:Linux社区

一.正则表达式匹配,其中:* ~ 为区分大小写匹配* ~* 为不区分大小写匹配* !~和!~*分别为区分大小写不匹配及不区分大小写不匹配二.文件及目录匹配,其中:* -f和!-f用来判断是否存在文件* -d和!-d用来判断是否存在目录* -e和!-e用来判断是否存在文件或目录* -x和!-x用来判断文件是否可执行三.rewrite指令的最后一项参数为flag标记,flag标记有:1.last    相当于apache里面的[L]标记,表示rewrite.2.break本条规则匹配完成后,终止匹配

实例讲解Linux系统中硬链接与软链接的创建

导读 Linux链接分两种,一种被称为硬链接(Hard Link),另一种被称为符号链接(Symbolic Link).默认情况下,ln命令产生硬链接.硬链接与软链接的区别从根本上要从Inode节点说起,下面就以实例讲解Linux系统中硬链接与软链接的创建,来实际看看Linux中两种链接方式的不同. 首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号.文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现

Linux系统搭建zabbix监控系统实例讲解

第一步,配置本地yum仓库,如下 1,挂载,挂载光驱到/mnt mount /dev/cdrom /mnt2,创建目录 mkdir -p /repo/cos7dvd3,然后使用命令创建yum仓库文件,注意指定正确的软件源位置yum-config-manager --add-repo file:///repo/cos7dvd/4,使用 yum repolist命令检测刚创建的yum软件仓库是否正常.5,使用yum clean all 清空缓存(非必要步骤,在yum更新时使用)6,使用vim编辑器给

[转帖]linux常用命令大全(linux基础命令入门到精通+实例讲解+持续更新+命令备忘录+面试复习)

https://www.cnblogs.com/caozy/p/9261224.html 总结的挺好的 我之前想总结 一直懒 这次国庆加班 也本来计划来着 感冒了 作罢 .. 作者:蓝藻(罗蓝国度) 创建时间:2018.7.3编辑时间:2019.7.16 前言 本文特点 授之以渔:了解命令学习方法.用途:不再死记硬背,拒绝漫无目的: 准确无误:所有命令执行通过(环境为centos7),拒绝复制粘贴: 实用性高:命令多为实际工作中用到的,实例讲解,拒绝纯理论: 条理清晰:分类归纳,快速找到想要的命

Android进阶(二十三)Android开发过程之实例讲解

Android开发过程之实例讲解 前言 回过头来审视之前做过的Android项目,发觉自己重新开发时忽然间不知所措了,间隔了太长时间没有开发导致自己的Android技能知识急剧下降.温故而知新. 废话少说,进入正题~ 下面主要以自己之前开发过的Android小项目为例,探讨Android开发基本流程,以及其中所涉及到的原理. 项目名称为"我查查",主要的实现功能是查询.添加商品评价,分享购物体验. 主要界面如下: 图1 主功能界面 图2 查看商品信息 图3 添加新评论 图4 扫码操作

[软考]挣值管理EVM详细解释及应用,实例讲解收集(信息系统项目管理师-成本管理)

开场白 由于最近工作很忙,挣值管理这部分早就看完了,就是没有时间整理,今天抽出时间整理好了发出来和大家一起学习.这里要记住英文缩写的意义及公式,注意实例中的问题使用哪个公式来解决,可以自己再多找些练习,熟能生巧. 文章由简入繁,由浅入深,再加上自己的理解,其中难免有纰漏,若路过此处的同行发现错误或有更好的解题思路,请不吝赐教. 挣值管理(Earned ValueManagement,EVM)项目的挣值管理是用与进度计划.成本预算和实际成本相联系的三个独立的变量,进行项目绩效测量的一种方法.它比较