어셈블리는 수조에서 최대 수를 찾을 수 있습니다

1732 단어
이 어셈블러의 최대 수를 구하는 함수에는 아직도 많은 하이라이트가 있다.
  • 어떻게 계산합니까?데이터 안의 어떤 그룹의 총 바이트 수입니다.
  • 제법 명령을 어떻게 사용하는지 피제수는%eax에 넣고, 제수는%ebx에 넣는다
  • 레지스터에 주소를 복사하는 방법
  • 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
    \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 코드:
    #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
    ", max_num(arr, 6));     return 0; }

    좋은 웹페이지 즐겨찾기