2012-06-04 4 views
1

어떻게 AVR 어셈블리에서이 작업을 수행 할 수 있습니까?AVR 어셈블리에 숫자 추가

다른 reg에 2 개의 숫자 (리틀 엔디안)가 있습니다. R23 -

# Number 1 
LDI R16 0x… 
LDI R17 0x… 
LDI R18 0x… 
LDI R19 0x… 
# Number 2 
LDI R20 0x… 
LDI R21 0x… 
LDI R22 0x… 
LDI R23 0x… 

내가 함께 추가 및 R20에 결과를 저장합니다. 그 뒤에 "수학"에 관한

+0

을 [당신이 구글을 시도 했습니까?] (HTTP : // AVR-ASM-튜토리얼. net/avr_en/beginner/CALC.html # AddAdc) 그렇지 않다면 StackOverflow가 아직 물어볼 적절한 장소가 아닙니다. (표준 방법이 작동하지 않으면 이것을 표시해야합니다.) – huon

+1

Google을 사용해 보았습니다. 그러나 레지스를 많이 추가 한 경우 캐리를받지 마십시오. -이게 뭐야? 'ADD R20, R16 .... ADC R21, R17 ....' 등등? – Droidik

+0

네, 그 방법은 다음과 같습니다. – JimmyB

답변

3

: 그것은 단지 십진법에서와 동일합니다 :

이 개 한 자리 숫자를 추가, 두 가지 경우로 간주되어야한다. 둘 중 하나의 합이 새로운 한자리 숫자 (5 + 4 = 9)이거나 '오버플로'가 발생하고 다른 숫자가 필요합니다 (5 + 6 = 11). 어떤 두 개의 숫자 (어떤 기초에서든지 그것은 10, 2, 256 또는 무엇이든간에) n 자리 길이의 합이 일 때 항상n+1 자리수의 가장 낮은 수의 2 배보다 낮을 것임을 유의하십시오. ij을 예를 들어, 길이 1의 수 (기수 10), 즉, 모두 09 (포함)으로한다. 10은 길이가 n+1 = 2 인 가장 낮은 숫자이므로 합계는 항상 2 x 10보다 작습니다.

두 개의 숫자를 추가 할 때 오버플로가 없거나 정확하게 1의 오버플로가있을 수 있습니다. 캐리 비트는 마지막 산술 연산에서이 오버플로를 저장합니다. 0 또는 1입니다.

따라서 각각 4x8 비트의 두 숫자를 추가하면 (처음 4 자릿수의 기본 256으로 볼 수 있음) 첫 번째 추가시 고려할 오버플로가 없습니다. 따라서 단지 ADD; ADDx = x + y + 0에 대한 작업으로 볼 수 있습니다. 그러나 처음 추가 한 후에는 오버플로가있을 수 있으므로이를 고려해야합니다. 이는 ADDC을 사용하여 수행됩니다. ADDCx = x + y + carry의 연산을 나타내며 여기서 carry은 위에서 언급 한 0 또는 1 일 수 있습니다.

x = x + y; 

if (carry == 1) { 
    error "The sum is too big for the datatype of x"; 
} 
+0

C에서'unsigned sum = x + y; 부호없는 캐리 = (합계

3

매우 간단 : 모든 숫자가 추가 된 후, 마지막으로 추가처럼, 나중에 캐리 비트에 반영되고 평가 될 수 다시 오버 플로우가 가능하게 numberrange의 오버 플로우에 반응하는 원인이 될 수 조작. 첫 번째 작업에 추가 사용 및 추가로 휴대가 이후 추가

# Number 1 
LDI R16 0x… 
LDI R17 0x… 
LDI R18 0x… 
LDI R19 0x… 
# Number 2 
LDI R20 0x… 
LDI R21 0x… 
LDI R22 0x… 
LDI R23 0x… 
# Add LSB of 1 and 2, result will be in R20 
ADD R20,R16 
# Add remaining bytes using the add-with-carry operation 
ADC R21,R17 
ADC R22,R18 
ADC R23,R19 # MSB 

결과에 대한 R20의 값을 덮어 쓰게됩니다 : R23합니다.

예제로 레지스터에 상수를로드하는 것만 알았지 만, subi 및 sbci opcode를 사용하여 상수를 추가 할 수 있다는 것을 잊지 마십시오. R19 : 예를 들어, R18 5를 추가

SUBI R18,-5 
SBCI R19,-1 # This isn't intuitive, but needs to be -1, not zero 

는 R18에서 5를 빼려면 : R19 :

SUBI R18,5 
SBCI R19,0