1

文字列を読み取って数値に変換するプログラムを作成しました。10 進法で入力された数値の文字列表現。変換の結果は、レジスタ 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
4

1 に答える 1

3

たとえば、次のように、乗算を16ビットから32ビットに10ずつ拡張できます。

; 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
于 2012-05-11T09:59:40.323 に答える