.file "mul64.S" .text .align 2 .global main .type main,function main: @ args = 0, pretend = 0, frame = 12 @ frame_needed = 1, uses_anonymous_args = 0 // On entry a1 and a2 contain the 32-bit integers to be multiplied (a, b) // On exit a1 and a2 contain the result (a1 bits 0-31, a2 bits 32-63) MOV a1, #0xFFFFFFFF MOV a2, #0x4 MOV ip, a1, LSR #16 // ip = a_hi MOV a4, a2, LSR #16 // a4 = b_hi BIC a1, a1, ip, LSL #16 // a1 = a_lo BIC a2, a2, a4, LSL #16 // a2 = b_lo MUL a3, a1, a2 // a3 = a_lo * b_lo (m_lo) MUL a2, ip, a2 // a2 = a_hi * b_lo (m_mid1) MUL a1, a4, a1 // a1 = a_lo * b_hi (m_mid2) MUL a4, ip, a4 // a4 = a_hi * b_hi (m_hi) ADDS ip, a2, a1 // ip = m_mid1 + m_mid2 (m_mid) ADDCS a4, a4, #0x10000 // a4 = m_hi + carry (m_hi') ADDS a1, a3, ip, LSL #16 // a1 = m_lo + (m_mid<<16) ADC a2, a4, ip, LSR #16 // a2 = m_hi' + (m_mid>>16) + carry MOV pc, lr // Definition der Variablen A: .word 0xAABBCCDD, 1, 2, 3, 4, 5, 6 B: .word 0, 0, 0, 0, 0, 0, 0 .Lfe1: .size main,.Lfe1-main .ident "GCC: (GNU) 3.2.1"