How can I add two registers together without add, adc, sub, sbb, inc, and dec?
            Asked
            
        
        
            Active
            
        
            Viewed 1,801 times
        
    -4
            
            
         
    
    
        MD XF
        
- 7,860
- 7
- 40
- 71
 
    
    
        Elmira Sargsyan
        
- 11
- 2
- 
                    3You forgot to mention what architecture. For x86, you can use `LEA`. – Jester Jan 24 '17 at 18:48
- 
                    @Jester For x86 – Elmira Sargsyan Jan 24 '17 at 18:51
- 
                    @Jester How about `movd mm0,eax; movd mm0,ecx; paddd mm0,mm1; movd eax,mm0`? – fuz Jan 24 '17 at 20:00
- 
                    x86 is (sort of) Turing-complete using just MOV instructions, doing math with memory addressing modes: https://stackoverflow.com/a/44799928/224132. (Of course LEA can do addition directly using address-mode syntax and machine encoding, but not subtraction. Although you didn't mention `neg`, so `neg` + `lea` can subtract.) – Peter Cordes Sep 20 '17 at 05:13
1 Answers
0
            Honestly, I just took this answer and translated it to assembly, the numbers to sum are in ax and bx, while registers cx and dx are used to get intermediate results, the final result is in dx :
  mov ax, 12801  ;◄■■ FIRST NUMBER.
  mov bx, 2017   ;◄■■ SECOND NUMBER.
l1:
  mov cx, ax
  and cx, bx
  mov dx, ax
  xor dx, bx
  mov ax, cx
  shl ax, 1
  mov bx, dx
  cmp ax, 0   ;◄■■ IF AX != 0 REPEAT.
  jne l1
;RESULT IN DX = 14818
 
    
    
        Community
        
- 1
- 1
 
    
    
        Jose Manuel Abarca Rodríguez
        
- 10,206
- 3
- 31
- 38
- 
                    1Nicely complicated. How about `mov si, ax; lea dx, [bx+si]` (if we stick to 16 bit which nobody said to). – Jester Jan 24 '17 at 19:15
- 
                    4I have this burning desire to optimize the code you present here, except that would be completely absurd because if you actually wanted optimal code, you'd use `add`! – Cody Gray - on strike Jan 25 '17 at 18:59