SHL Reg,ValueYou might be wondering what all this has to do with multiplaction, well if we shift all the bits of a number this is what happens:
0 1 0 0 0 0 0 1 (65) ============> Shift Left by 1 (SHL AX,1) 1 0 0 0 0 0 1 0 (130)Hehe, you gota be slow not to know what that does! See how the number got multiplied by 2? Ding ding ding! You've just found a way of quick multiplication!
But how often do you need to multiply something by two? Not very, but you can multiply by powers of 2 VERY easily. You see, every time you shift the bits of a number to the left by 1 you multiply by 2, but what would happen if you now shift in 2s or 3s or even 4s?
If your getting confused on what I'm going on about, here's another diagram to clear things up!
0 0 1 0 0 0 0 1 (33) ============> Shift Left by 2 (SHL AX,2) 1 0 0 0 0 1 0 0 (132)Wow we multiplyed by four, all by shifting the whole register by 2 bits to the left. That's multiplication at it's best, because you've just done a relevently difficult task in under 4 clocks!
But, you can multiply with other numbers too! Here's a table that shows you what happens when you shift a register's numberto the left by x:
___________________________________ | X | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |MUL| 2 | 4 | 8 | 16| 32| 64|128|256| |___|___|___|___|___|___|___|___|___|So if we shift 20 to the left by 3 (SHL AX,3) you'll get 160 in AX. Wonderful.
\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/ C/C++ programmers, you know the << and >> commands? Well this is their ASM equivalant! You usally see people using them like this for speed y=(a<<3)+(a<<2) /\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\/\
Now, not all of us are lucky enough to need to multiply by 2 4 8 16 32 64 128 or 256. You ussaly have to multiply by Base 10 relative numbers like 200. Now comes the trick bit, to be or not to be! Ok, we'll start with something simple, lets say multiplying by 6.
Before getting to the ASM bit, we'll start some theory work. Lets say y is the outcome, and a is the input (a is AX, and y is what AX will be after we finish off with it). Ok to multiply a by 6 we do this :
y=(a<<1)+(a<<2)Hmmm ... well what it's saying up there is we will shift a to the left by 1, and then get the orignal a back and shift it by two. This is easier than it sounds.
(a is in AX,y is AX at the end) MOV BX,AX ;We'll save AX's value for later use. SHL AX,1 ;Shift ax to the left by 1 (multiply by 2) XCHG AX,BX ;Ok we'll swap (AX*2) with AX, so we can multiply the orignal again. SHL AX,2 ;Now we'll shift ax to the left by 2 (multiply by 4) ADD AX,BX ;we'll add (AX*2)+(AX*4) giving us AX*6.ok so we basicly did this : (AX*2)+(AX*4), in maths that would give us AX+AX+AX+AX+AX+AX, which is ofcourse AX*6.
If you get it, read the source code below it does it a tad faster and with a smaller code but does the exact same thing, if you did'nt email me (firstname.lastname@example.org) and tell me what you don't get, so I can add it to the new version of the tutorial.
(a is in AX) SHL AX,1 ;shift ax to the left by 1. MOV BX,AX ;add (AX*2) to BX SHL AX,1 ;shift (ax*2) to the left by 1 ADD BX,AX ;add ((AX*2)*2) to BXSmart is'nt it? If we multiply 2 by 2 what do we get? 4 and if we multiplied it by 2 agian? we get 8. hmm ... 4+8=12=2*6. So (a*2)+(a*2*2)=a*6 hehehehe get the point? good. = )