Convert string to int. x86 32 bit Assembler using Nasm

后端 未结 3 1364
遇见更好的自我
遇见更好的自我 2020-12-06 21:11

So I\'m trying to convert a string to a number so I can add another number to it later. here is what I have to far in my .text for the conversion. num2Entered is what the us

相关标签:
3条回答
  • 2020-12-06 21:46

    Each character is only a single byte, but you probably want to add it to a larger result. Might as well go for 32 bits... (can hobble your routine to 16 bits if you really want to)

    mov edx, num3entered ; our string
    atoi:
    xor eax, eax ; zero a "result so far"
    .top:
    movzx ecx, byte [edx] ; get a character
    inc edx ; ready for next one
    cmp ecx, '0' ; valid?
    jb .done
    cmp ecx, '9'
    ja .done
    sub ecx, '0' ; "convert" character to number
    imul eax, 10 ; multiply "result so far" by ten
    add eax, ecx ; add in current digit
    jmp .top ; until done
    .done:
    ret
    

    That's off the top of my head and may have errors, but "something like that". It'll stop at the end of a zero-terminated string, or a linefeed-terminated string... or any invalid character (which you may not want). Modify to suit.

    0 讨论(0)
  • 2020-12-06 21:55
    or we can say:
    "123"  -> starting from 1
    
    1 + 0 * 10  = 1
    2 + 1 * 10  = 12
    3 + 12 * 10 = 123
    
    This will match to atoi function as below:
    
    atoi:
    
    push    %ebx        # preserve working registers
    push    %edx
    push    %esi
    
    mov $0, %eax        # initialize the accumulator
    nxchr:
        mov $0, %ebx        # clear all the bits in EBX
        mov (%esi), %bl     # load next character in BL
        inc %esi            # and advance source index
    
        cmp $'0', %bl       # does character preceed '0'?
        jb  inval           # yes, it's not a numeral jb:jump below
        cmp $'9', %bl       # does character follow '9'?
        ja  inval           # yes, it's not a numeral ja:jump above
    
        sub $'0', %bl       # else convert numeral to int
        mull ten            # multiply accumulator by ten. %eax * 10
        add %ebx, %eax      # and then add the new integer
        jmp nxchr           # go back for another numeral
    
    inval:
       pop  %esi            # recover saved registers
       pop  %edx
       pop  %ebx
       ret
    

    Hope this will help.

    0 讨论(0)
  • 2020-12-06 22:01
    "123"
     |||     val = 0
     |||______ val = val + ('3' - 48) * 10power0       [val now is 3]
     ||_______ val = 3   + ('2' - 48) * 10power1       [val now is 23] 
     |________ val = 23  + ('1' - 48) * 10power2       [val now is 123]
    
    note: ascii of '1' means 49, '2' means 50 and so on
    
    0 讨论(0)
提交回复
热议问题