如何在Tasm中将字符串转换为数字?

时间:2012-05-06 14:27:00

标签: assembly x86 tasm

我创建了一个读取字符串并将其转换为数字的程序。在十进制系统中输入的数字的字符串表示形式。转换的结果是寄存器ax。 我用tasm16。

我该怎么做才能将字符串转换得更大(超过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

1 个答案:

答案 0 :(得分:2)

例如,你可以将乘法乘以10从16扩展到32位,如下所示:

; 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