Alex
Alex

Reputation: 1124

Small assembly code sequence optimization (intel x86)

I am doing some exercises in assembly language and I found a question about optimization which I can't figure out. Can anyone help me with them

So the question is to optimize the following assembly code:

----------------------------Example1-------------------------

mov dx, 0 ---> this one I know-> xor dx,dx

----------------------------Example2------------------------

cmp ax, 0
je label

----------------------------Example3-------------------------

mov ax, x
cwd
mov si, 16  
idiv si     

----> Most I can think of in this example is to subs last 2 lines by idiv 16, but I am not sure

----------------------------Example4-------------------------

mov ax, x
mov bx, 7
mul bx
mov t, ax

----------------------------Example5---------------------------

mov si, offset array1
mov di, offset array2
; for i = 0; i < n; ++i
do:
   mov bx, [si]
   mov [di], bx
   add si, 2
   add di, 2
loop do
endforloop

Upvotes: 1

Views: 1920

Answers (2)

Jerry Coffin
Jerry Coffin

Reputation: 490028

For example three, division by a power of two can be implemented as a right shift.

Note that in example 5, the current code fails to initialize CX as needed (and in the optimized version, you'd definitely want to do that too).

Upvotes: 0

paxdiablo
paxdiablo

Reputation: 881113

For example 2, you should look at the and or test opcodes. Similar to example 1, they allow you to remove the need for a constant.

For example 4, remember that x * 7 is the same as x * (8 - 1) or, expanding that, x * 8 - x. Multiplying by eight can be done with a shift instruction.

For example 5, you'd think Intel would have provided a much simpler way to transfer from SI to DI, since that is the whole reason for their existence. Maybe something like a REPetitive MOVe String Word :-)

Upvotes: 5

Related Questions