How to find the number of digits in assembly 8086?

I am a new build programmer, and I could not find the number of digits, the number of which. My goal is to find factorials. I am programming in an 8086 build emulator.

+4
source share
1 answer

The most efficient way to perform this operation is to use the bsr (see slides , 20 to 25).

The following code should do this:

  .text .globl main .type main, @function main: movl $1024, %eax ;; pushing the integer (1024) to analyze bsrl %eax, %eax ;; bit scan reverse (give the smallest non zero index) inc %eax ;; taking the 0th index into account 

But, I think you need base 10 log, not base 2 ... So, here is the code:

  .text .globl main .type main, @function main: movl $1024, %eax ;; pushing the integer (1024) to analyze bsrl %eax, %eax ;; bit scan reverse (give the smallest non zero index) inc %eax ;; taking the 0th index into account pushl %eax ;; saving the previous result on the stack fildl (%esp) ;; loading the previous result to the FPU stack (st(0)) fldlg2 ;; loading log10(2) on the FPU stack fmulp %st, %st(1) ;; multiplying %st(0) and %st(1) and storing result in %st(0) ;; We need to set the FPU control word to 'round-up' (and not 'round-down') fstcw -2(%esp) ;; saving the old FPU control word movw -2(%esp), %ax ;; storing the FPU control word in %ax andw $0xf3ff, %ax ;; removing everything else orw $0x0800, %ax ;; setting the proper bit to '1' movw %ax, -4(%esp) ;; getting the value back to memory fldcw -4(%esp) ;; setting the FPU control word to the proper value frndint ;; rounding-up fldcw -2(%esp) ;; restoring the old FPU control word fistpl (%esp) ;; loading the final result to the stack popl %eax ;; setting the return value to be our result leave ret 

I am curious to know if anyone can find this better! Indeed, using SSE instructions can help.

+1
source

All Articles