ARM 기계 코드, 26 바이트
16 진 덤프 (little endian) :
6810 4601 f852 cb04 4560 bfc8 4660 4561 bfb8 4661 3b01 d8f5 4770
이것은 시스템 호출이나 라이브러리 의존성이없는 함수입니다. 인코딩은 32 비트 ARM 용 변수 (2 또는 4 바이트) 인코딩 인 Thumb-2입니다. 상상할 수 있듯이 여기에서 첫 번째 요소와 마지막 요소를 정렬하고 선택하는 쉬운 방법은 없습니다. 전반적으로 여기에는 정말 멋진 것이 없으며 참조 구현과 거의 동일합니다.
언 골프 어셈블리 (GNU 구문) :
.syntax unified
.text
.global minmax
.thumb_func
minmax:
@Input: @r0 and r1 are dummy parameters (they don't do anything)
@r2 - Pointer to list of integers (int*)
@r3 - Number of integers to sort (size_t)
@Output:
@Minimum of the list in r0 (int)
@Maximum in r1 (int)
ldr r0,[r2] @min=r2[0]
mov r1,r0 @max=min
loop:
@ip is intra-procedure call register, a.k.a. r12
ldr ip,[r2],#4 @ip=*r2++
cmp r0,ip
it gt @if (r0>ip)
movgt r0,ip @r0=ip
cmp r1,ip
it lt @if (r1<ip)
movlt r1,ip @r1=ip
subs r3,r3,#1
bhi loop @while (--r3>0)
bx lr @Return
라즈베리 파이 3에서 테스트; 다음은 테스트 스크립트입니다 (C99, argv를 통해 입력).
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//First 2 arguments are dummies.
uint64_t minmax(int,int,int* array,size_t size);
int main(int argc,char** argv) {
int i;
int array[argc-1];
for (i=1;i<argc;i++) {
array[i-1]=atoi(argv[i]);
}
uint64_t result = minmax(0,0,array,argc-1);
printf("Minimum is %d, maximum is %d.\n",(unsigned)result,(unsigned)(result>>32));
}