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


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

  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;
}


转载于:https://my.oschina.net/guonaihong/blog/491614

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值