1

10進数を0から65535から16進数に変換するプログラムを使用していました。問題は、私のプログラムが4桁の16進数を出力しないことです。たとえば、FFFFの代わりに5FF、1111の代わりに711を出力しますが、間違いを見つけることができません。助けてください。

コードは次のとおりです。

;***************************************************************
; decimal to hexadecimal
;***************************************************************

.model small

bufSize EQU 121

.stack 100h

.data

    bufSize DB  bufSize     
    read DB  ?              ;how many symbols
    buf  DB  bufSize dup (?)    

    msg  DB  'Please, enter decimal digit: $'
    enterr  DB  13, 10, '$'
    errormsg DB  'wrong input $'
    form     DB  'answer is: $'

.code

begin:
    MOV ax, @data       
    MOV ds, ax          

;****reads line****
    MOV ah, 9
    MOV dx, offset msg
    INT 21h         

    MOV ah, 0Ah
    MOV dx, offset bufSize
    INT 21h         

    MOV ah, 9
    MOV dx, offset enterr
    INT 21h         

;****algorythm****
    XOR ax, ax          
    MOV cl, read        ;how many symbols

    MOV bx, offset buf  ;first symbol to bx






check: 
    CMP cl, 0
    MOV ah, 9
    JNE loop0
    MOV dx, offset errormsg
    INT 21h         ;spausdiname rezultato žinutę
    JE ending

errorr:
    MOV ah, 9
    MOV dx, offset errormsg
    INT 21h         ;spausdiname rezultato žinutę
    JMP ending
loop0:
    PUSH ax
    PUSH dx
    XOR ax,ax
    XOR dx,dx
    JMP loop1


loop1:
    MOV dh,0Ah
    MUL dh
    MOV dl,[bx] 
    cmp dl, '0'
    JB errorr
    cmp dl, '9'
    JA errorr

    SUB dl,30h
    ADD al,dl

loop2:  
    INC bx          

    DEC cl          
    CMP cl, 0           
    JNE loop1           

    MOV cx, 16
    PUSH '$$'

Division:
    MOV dx, 0       
    DIV cx      ;[DX,AX]:10 = AX(remainder DX)
    PUSH dx     
    CMP ax, 0       
    JA  Division        

    ;printing
    MOV ah, 9
    MOV dx, offset form
    INT 21h         
    MOV ah, 2       
Print:
    POP dx      
    CMP dx, "$$"    
    JE  ending      
    CMP dx, 9
    JNBE above
less:
    ADD dl, '0'     
    INT 21h     
    JMP Print   
above:
    ADD dl, '7'     
    INT 21h 
    JMP Print   

    pop dx
    pop ax



ending:
    MOV ah, 4Ch
    MOV al, 0           
    INT 21h         



END begin

ご回答ありがとうございます。:)

4

1 に答える 1

0

問題は、最初のループの乗算ステップにあります。

MUL dh

この形式のMUL命令は、8 ビット レジスタまたはメモリ オペランド (ここではDH) を受け取り、それを 8 ビット レジスタで乗算しAL、16 ビットの結果を に格納しAXます。これは 8 ビットのオペランドのみを許可するため、最大 255 までの入力値に対してのみ正しく機能します。最大 65535 の値に対して機能させたい場合は、2 つの 16 ビット値を乗算して32 ビットの結果DX:AX(および、その結果の上位 16 ビットは無視されます。これらは に入れられますDX)。例:

MUL dx

ただし、これにはDL、現在の桁を保持するために既に使用しているため、レジスタをシャッフルする必要があり、前述DXのように、32 ビットの結果の上位 16 ビットに設定されます。この状況では、IMUL符号付き乗算命令を使用することをお勧めします。これは、最大 3 つのパラメーターを使用できるため便利です (x86 では珍しい)。

MOV dx,0Ah;
IMUL ax,ax,0Ah

これAXにより、結果の下位 16 ビットが設定され、上位 16 ビットが破棄されます。乗算が符号付きであるという事実は、ここでは何の違いもありません。下位 16 ビットは両方の場合で同じになるからです。

于 2012-11-04T16:49:24.887 に答える