Welcome toVigges Developer Community-Open, Learning,Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.0k views
in Technique[技术] by (71.8m points)

assembly - How to convert string to number in Tasm?

I made a program that reads a string and converts it into a number. A string representation of the number entered in the decimal system. The result of of converting is in register ax. I use tasm16.

How do I do that I can convert a string bigger(more than 65535)?

model small
stack 100h
printstring macro msg
    mov ah,09h
    mov dx,offset msg
    int 21h
endm
data segment
    cr equ 0dh
    lf equ 0ah
    errorInput db 'Wrong input',cr,lf,'$'
    inputAmsg db 'Please input A',cr,lf,'$'
    outstring db 'Output:',cr,lf,'$'
    maxAbuf db 10
        db ?
        db 10 dup(0)
        db '$'
    result dw 0

data ends
code segment
    assume cs:code, ds:data
start:
    mov ax,data
    mov ds,ax
;input A
    printstring inputAmsg
    mov ah,0ah
    lea dx,maxAbuf
    int 21h
    printstring outstring

    mov ah,09h
    lea dx,maxAbuf+2
    int 21h
;in:
;dx:address of string
;out
;dx:ax - result ;work only ax
;
    call Convert
    jmp exit
;in:
;dx:address of string
;out
;dx:ax - result
;9999989d = 989675h
Convert proc
        xor ax,ax
        xor cx,cx
        mov bx,10 ;base
        mov si, offset dx
        xor dx,dx
getnewchar: mov cl,[si]
        cmp cl,0dh ;if `$` exit
        jz endproc
        sub cl,'0' ;or 30h
        mul bx
        add ax,cx
;I do not know what to write here, if there is an exit for the bit grid.
        adc dx,0
        inc si
        jmp getnewchar
endproc:
    ret
    endp

exit:   mov ax,4c00h
    int 21h
code ends
end start
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

You could, for example, extend your multiplication by 10 from 16 to 32 bits like this:

; file: mul32ten.asm
; compile: nasm.exe mul32ten.asm -f bin -o mul32ten.com

bits 16
org 0x100

    xor     dx, dx
    xor     ax, ax

    mov     si, MyStr

NextDigit:
    mov     bl, [si]
    or      bl, bl
    je      Done
    call    MulDxAxBy10
    sub     bl, '0'
    add     al, bl
    adc     ah, 0
    adc     dx, 0
    inc     si
    jmp     NextDigit

Done:
    ; dx:ax should be equal to 7FFFFFFF now
    ret

MulDxAxBy10:
    push    si
    push    di
    shld    dx, ax, 1
    shl     ax, 1       ; dx:ax = n * 2
    mov     si, ax
    mov     di, dx      ; di:si = n * 2
    shld    dx, ax, 2
    shl     ax, 2       ; dx:ax = n * 8
    add     ax, si
    adc     dx, di      ; dx:ax = n * 8 + n * 2 = n * (8 + 2) = n * 10
    pop     di
    pop     si
    ret

MyStr db "2147483647", 0

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to Vigges Developer Community for programmer and developer-Open, Learning and Share
...