2011-01-10 8 views
2

オフセットがdiである文字列があります。このprocはaxの整数に変換します。 procは0-999で有効です。たとえば1000または2343の場合、または1000より大きい他の数の場合は機能しません。問題はどこだ ?私は混乱している。また、tlenは私が定義した一時バイトです。とにかく:)アセンブリatoi dizzyエラー

かなり恐ろしいです

atoi proc far 
    mov cl,len 
    mov ch,0 
    mov ah,0 
start: 
    dec cl 
    jcxz addlastdigit 
    mov tlen,cl;save cl 
    mov al,1 
    mov bl,10 
    getMultiplier: 
    mul bl 
    Loop getMultiplier 
    mov cl,tlen ; retrive cl 
    mov dl,byte ptr[di] 
    sub dl,30h 
    mul dl 
    add num,ax 
    inc di 
    jmp start 
addlastdigit: 
    mov ax,num 
    mov dl,byte ptr[di] 
    sub dl,30h 
    mov dh,0 

    add ax,dx 

    Ret 
atoi endp 
+0

コードを正しくフォーマットしてください... – trojanfoe

答えて

1

問題は "mul dl"です。 DLは8ビットのレジスタであるため、DLの最大値は255です。おそらく100を掛け合わせて(たとえば「99 * 100 + 9 = 999」)、1000以上で乗算できません。

。コードは、それが唯一の文字ごとに1つのMULを行うようにコードも書き換える必要がある大きなレジスタを使用する必要が

例(未テストNASM):

atioi: 
    xor eax,eax 

.nextChar: 
    movzx ebx,byte [di] 
    inc di 
    sub bl,'0' 
    jb .invalidChar 
    cmp bl,9 
    ja .invalidChar 
    lea eax,[eax*4+eax] 
    sub ecx,1 
    lea eax,[eax*2+ebx] 
    jne .nextChar 
    ret 

.invalidChar: 
    ; Not sure what you're planning to do with error handling.. 

上記のコードは、80386以降が前提CPU(はリアルモードまたは16ビットコードで動作します)、「2 ** 32-1」(40億以上)までの値を正しく処理する必要があります。

あなたが生まれる前(80286およびそれ以前)にはおそらく時代遅れだった80x86 CPUについては、レジスタのペア(例: DX:AX)を32ビットレジスタの代わりに使用するか、または65536未満の結果に制限し、32ビットレジスタの代わりに16ビットレジスタを使用します(たとえば、EBXをBX、EAXをAX、等)。

1

、それは動作しませんなぜ即時の理由は、あなたが、特に、mul dlを8ビットの乗算を使用していることです。 mul blは、1000で動作することはほとんどなく、10000以上でも失敗します。

一般的なアドバイス:デバッガを使用してコードをステップ実行し、どこが間違っているかを確認します。

+0

+1 General Advice;) – BlackBear

関連する問題