Skip to the content.

ADC, ADCS

Summary

이름에 들어간 C는 Carry (자리올림 플래그)를 뜻합니다. 한 줄로 요약하면 "보통 덧셈을 하고 남은 잔돈(올림수)까지 뒤차가 깔끔하게 이어받아서 더해주는 연쇄 덧셈 기차"입니다. 64비트를 초월해 128비트, 256비트 무한대의 숫자를 다루는 우주급 아키텍처 연산의 핵심 뼈대이죠.


🧠 ADC & ADCS: 64비트 장벽을 허무는 빅데이터 연쇄 기차

우리가 쓰는 레지스터는 딱 64비트 크기입니다. 만약 64비트 서랍 크기를 아득히 넘어가는 우주적인 대용량 숫자(예: 128비트 정수 연산)를 더해야 할 때 상남자들은 어떻게 할까요? 숫자를 하위 64비트와 상위 64비트로 반반 쪼개서 기차처럼 연쇄 덧셈을 해야 합니다. 이때 캐리(Carry) 플래그를 주고받는 마법이 일어납니다!


🧱 소스코드 샘플

// =========================================================================
// Hun ARM64 Mnemonic Dictionary - Open Example
// Mnemonic: ADC / ADCS (Add with Carry)
// Description: 앞선 연산에서 발생한 올림수(Carry) 플래그까지 포함하여 덧셈 수행
// =========================================================================

.global _hun_adc_128bit_add_example
.text
.align 3

_hun_adc_128bit_add_example:
    // [무대 세팅] 128비트 거대한 숫자 2쌍을 준비합니다.
    // 숫자 A (128비트): X1(상위 64비트) : X0(하위 64비트)
    // 숫자 B (128비트): X3(상위 64비트) : X2(하위 64비트)
    
    // 계산을 쉽게 하기 위해 하위 64비트 합이 무조건 넘치도록(Overflow) 세팅합니다.
    MOV     X0, #0xFFFFFFFFFFFFFFFF         // A의 하위값 (최대치)
    MOV     X1, #0x0000000000000001         // A의 상위값
    
    MOV     X2, #0x0000000000000001         // B의 하위값
    MOV     X3, #0x0000000000000001         // B의 상위값

    // 1. [앞차 출발: ADCS] 하위 64비트끼리 먼저 더합니다.
    // 0xFFFFFFFFFFFFFFFF + 0x1 을 하면 자릿수가 넘쳐서 0이 되고 올림수(1)가 발생합니다.
    // 맨 끝의 'S' 덕분에 CPU의 Carry 플래그(C)가 즉시 '1'로 켜집니다!
    ADCS    X4, X0, X2                      // X4 = X0 + X2 (결과는 0, 캐리 플래그 C=1 셋팅)

    // 2. [뒤차 출발: ADC] 상위 64비트끼리 더하면서 앞의 올림수까지 싹 쓸어 담습니다.
    // 공식: 대상 = 소스1 + 소스2 + Carry플래그(0 또는 1)
    // 계산: X1(1) + X3(1) + Carry(1) = 총 '3'이 됩니다!
    ADC     X5, X1, X3                      // X5 = X1 + X3 + Carry (결과는 3)

    // [최종 결과] 
    // 최종 128비트 결과값은 X5(상위):X4(하위) 형태로 '3 : 0' 이라는 완벽한 대장 정수가 저장됩니다.
    // 단 2줄, 2클럭 만에 128비트 수학 연산을 하드웨어 회로 수준에서 종결!
    RET



🎯 요약