码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-08-12 23:43:43      阅读:198      评论:0      收藏:0      [点我收藏+]

标签:


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

  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

如同如下的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;
}


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

标签:

原文地址:http://my.oschina.net/guonaihong/blog/491614

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!