2016-12-05 1 views
0

나는 최근에 이런 질문들을 많이 들었지만, 어셈블리는 여전히 내게는 꽤 외국 적이라고 느낀다.어셈블리에서 배열의 8 비트 값의 16 비트 합계는 어떻게 계산합니까?

Arduino를 사용하여 컴퓨터 과학 수업을위한 Atmel AVR 어셈블리에 함수를 작성해야합니다.이 클래스는 배열의 8 비트 값의 합을 계산하고이를 16 비트 정수로 반환합니다. 이 함수는 바이트의 배열과 배열의 길이를 인수로 취하고 그 인수가 함수가 호출 될 때 r24와 r22에 각각 저장되는 것으로 가정합니다. 나는 분기 명령 등을 사용할 수있다.

코드는 다음 형식으로되어 있습니다 :

.global sumArray 
sumArray: 
    //magic happens 
    ret 

나는 루프를하고 같은 카운터 사물을 증가하는 방법을 알고,하지만 난 정말 내가 이런 짓을 했을까 방법으로 손실입니다.

나는 이것을 어떻게 할 것인지 확신하지 못한다. 누구든지 Atmel AVR Assembly에서이 기능을 작성하는 방법을 알고 있습니까? 어떤 도움을 많이 주시면 감사하겠습니다!

+1

힌트 : '추가'와 'ADC'를 사용하십시오. – Jester

답변

2

왜 컴파일러에게 질문하지 않습니까? , 이것은 가장 솔직 해결책이 될 수 없습니다

.global sumArray 
sumArray: 
    mov r19, r24 
    movw r30, r24 
    ldi r24, 0 
    ldi r25, 0 
.L2: 
    mov r18, r30 
    sub r18, r19 
    cp r18, r22 
    brsh .L5 
    ld r18, Z+ 
    add r24, r18 
    adc r25,__zero_reg__ 
    rjmp .L2 
.L5: 
    ret 

하지만,이 코드를 공부하면 작동 방법, 당신은 이해할 수 : avr-gcc -std=c99 -mmcu=avr5 -Os -S sum8-16.c로 컴파일

#include <stdint.h> 

uint16_t sumArray(uint8_t *val, uint8_t count) 
{ 
    uint16_t sum = 0; 
    for (uint8_t i = 0; i < count; i++) 
     sum += val[i]; 
    return sum; 
} 

다음 어셈블리를 생성 잘하면, 자신의 버전을 함께.

+0

Ahh ok, 전에 godbolt.org를 사용해 보았습니다.이 솔루션은 훨씬 명확합니다. 정말 고맙습니다! – stealthbomber10

+1

이 사이트에 대해 알지 못했습니다. 링크를 이용해 주셔서 감사합니다! 그것이 생성하는 코드는 위의 것보다 훨씬 복잡하지는 않습니다 (15 명령 vs. 13),'-mmcu = avr5 -Os' 옵션을 주면됩니다. –

0

뭔가 빠르고 더러운 것을 원하면 8 비트 레지스터에 두 개의 8 비트 값을 추가하십시오. 합이 입력보다 작 으면 두 번째 8 비트 레지스터를 1과 같게 만듭니다. 그렇지 않으면 0입니다. 따라서 수행 할 수 있습니다.

프로세서에는 이미 여기에 사용할 수있는 캐리 플래그라는 것이 있어야합니다.

0

연필과 종이 한 번에 두 자리 숫자를 두 개 추가 할 때 어떻게 두 자리 숫자 십진수를 추가합니까? 12 + 49? 2 + 9 = 11을 더할 수 있습니다. 그러면 어떻게해야합니까? (단어 캐리 검색)

관련 문제