文档章节

汇编实现在数组中查找最大数

guonaihong
 guonaihong
发布于 2015/08/12 22:51
字数 325
阅读 524
收藏 3


这个汇编版的求最大数的函数还是有很多亮点的:

  1. 如何计算.data里面某个数组的总字节数。

  2. 如何使用除法指令,被除数要放到%eax里面,除数要放到%ebx里面

  3. 如何使用leaq把地址复制到某个寄存器中

  4. cmovl指令,带条件的赋值语句

code:

.section .data
data_item:
    .long 1,2,3,4,5,6,7,8,9,10,15, -1, 99
data_item_end:

.equ data_item_len, data_item_end - data_item

fmt:
    .ascii "%d\n\0"

.section .text

.global _start
_start:
    movq $data_item_len, %rax  #rax里面是被除数
    movl %eax, %edx
    movl $4, %ebx              #除数
    sarl $31, %edx
    divl %ebx

    pushq %rax       #数组长度
    pushq $data_item #数组元素首地址
    call max_num

    addq $16, %rsp

    movl %eax, %esi
    movl $fmt, %edi
    xorl %eax, %eax
    call printf

    xorl %edi, %edi
    call exit

.type max_num, @function
max_num:
    pushq %rbp
    movq %rsp, %rbp

    movq 16(%rbp), %rdi #第一个参数
    movl 24(%rbp), %esi #第二个参数
    
    movl -4(%rdi, %rsi, 4), %eax
    leaq -4(%rdi, %rsi, 4), %rdx
    jmp max_num_end

max_num_loop_start:
    movl (%rdx), %ecx
    subl $1, %esi
    cmpl  %ecx, %eax
    cmovl %ecx, %eax
    subq $4, %rdx

max_num_end:
    testl %esi, %esi
    jg max_num_loop_start

    movq %rbp, %rsp
    popq %rbp
    ret

编译脚本:

gcc -c max_num.s -g && ld ./max_num.o -lc -dynamic-linker /lib64/ld-linux-x86-64.so.2 && ./a.out

如同如下的c code:

#include <stdio.h>

int max_num(int *arr, int n) {
    int max;
    int i;

    max = arr[n - 1]; 
    while (n-- > 0) {
        if (max < arr[n])
            max = arr[n];
    }   
    return max;
}

int main() {
    int arr[] = {1, 2, 3, 4, 5, 6}; 
    printf("%d\n", max_num(arr, 6));
    return 0;
}


© 著作权归作者所有

guonaihong

guonaihong

粉丝 6
博文 83
码字总数 27591
作品 1
徐汇
程序员
私信 提问
加载中

评论(2)

guonaihong
guonaihong 博主

引用来自“袁弘龙”的评论

感觉代码像是编译器生成的
首先回答了上面的代码不是编译器生成的。 如果是编译器调用max_num,关于长度那部分编译器会生成个固定的值。这其实很好理解,编译器在编译时可以获得长度信息,所以编译时长度就固定。人工写的话,只有写的过程,所以不会把长度写死。 至于为什么感觉那么编译器生成的。比如3/2不知道怎么用除法汇编指令,会在c里面写好,再gcc -S 看下除法指令的用法。这种事多了,时间长了,代码就是gcc风格的了。可能从gcc那边偷学了太多
天命剑主
天命剑主
感觉代码像是编译器生成的
LeetCode算法题-Largest Number At Least Twice of Others(Java实现)

这是悦乐书的第308次更新,第328篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第177题(顺位题号是747)。在给定的整数数组中,总有一个最大的元素。查找数组中的最大元素是...

小川94
2019/04/17
0
0
pkzd之进程设计策略1 (注:文章为原创,但是因为在博客园发布被移除,所以发在这了)

首先对于任何一个操作系统, 系统内核必须应该明确一种获取进程信息的办法, pkzd所使用的是一个全局数组struct proc proc[NPROC]。 其中struct proc为进程结构的结构体, NPROC是一个用来确定当...

mc_robin
2015/01/16
158
0
Delphi中使用汇编(关于POS函数的问题)

在delphi中使用汇编异常的简单,只用使用关键字asm ....end来引导就行了。 得到一个字符在字符串中的位置有很多方法,最简单的就是使用delphi自己的Pos函数 另外一个方法就是使用 循环查找字...

技术小美
2017/11/06
0
0
LeetCode算法题-Next Greater Element I(Java实现)

这是悦乐书的第244次更新,第257篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第111题(顺位题号是496)。你有两个数组(没有重复)nums1和nums2,其中nums1的元素是nums2的...

小川94
2019/01/29
0
0
图解数组高级冒泡排序和选择排序

微语:人生若只如初见,何事秋风悲画扇? 等闲变却故人心,却道故人心易变。 骊山语罢清宵半,泪雨霖铃终不怨。 何如薄幸锦衣郎,比翼连枝当日愿。 ——纳兰性德 《木兰词》 一、数组高级冒泡...

zi愿为你抚琴
2018/01/23
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Numpy处理图片方法

在进行图像领域的深度学习的时候经常需要对图片进行处理,包括图像的翻转,压缩,截取等,一般都是用Numpy来处理。处理起来也很方便。 In[3] # 导入需要的包 import numpy as np import matp...

北方的郎
20分钟前
7
0
AMD集中擢升高管:从Intel挖了个高手

  1 月 17 日,AMD 官方宣布多项人事升迁、新人任命,擢升了四位高级副总裁:   AMD 同时还宣布, 聘请行业资深人士 Daniel McNamara 出任高级副总裁兼服务器业务部总经理,负责在第二代...

水果黄瓜
24分钟前
6
0
什么是泛型?

一、泛型的概念 泛型是 Java SE5 出现的新特性,泛型的本质是类型参数化或参数化类型,在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型。 二、泛型的意义 一般的...

hncboy
59分钟前
7
0
dynamic-connectivity 动态连通性问题之 quick-union 算法

quick-union 的思想是:若对象 p 的 root_id 和对象 q 的 root_id 相等,则认为 p 和 q 连通。 若要将对象 p 和对象 q 连通(已知两对象未连通),则将 p 的 root_id 的值设为 q 的 root_id ...

Phpythoner_Alei
今天
51
0
OSChina 周六乱弹 —— 实在选不出来就唱国歌

Osc乱弹歌单(2020)请戳(这里) 【今日歌曲】 @花间小酌 :#今日歌曲推荐# 分享阿冗的单曲《你的答案》。--祝大家在2020年都找到自己答案。 《你的答案》- 阿冗 手机党少年们想听歌,请使劲...

小小编辑
今天
291
6

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部