Вопрос по x86, assembly – Как преобразовать строку в число в Tasm?

1

Я сделал программу, которая читает строку и конвертирует ее в число. Строковое представление числа, введенного в десятичной системе. Результат конвертации находится в регистре ax. Я пользуюсь tasm16.

Как мне сделать, чтобы я мог преобразовать строку больше (более 65535)?

<code>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
</code>

Ваш Ответ

1   ответ
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

Похожие вопросы