2012-03-17 9 views
0

このコードで読み取った文字列をバイナリとヘキサに変換しようとしています。アセンブリ文字列の2進数とHexaへの小数点8086

READ_STRING: 
    MOV DX, offset buffer 
    MOV AH, 0Ah 
    INT 21h 
    MOV SI, 1d 
    MOV AX, 0 
    XOR CX, CX 
    MOV CL, buffer[SI] 
    INC SI 

LOOP_1: 
    MOV DX, 10 
    MUL DX 
    MOV DL, buffer[SI] 
    SUB DL, 30h 
    MOV DH, 0 
    ADD AX, DX 
    INC SI 
    LOOP LOOP_1 

    RET 

これまでのところ私は、バイナリ出力のためにこのコードを持っていますが、それは常に版画 "1001"(10進数で9):

NEXT: 

    XOR AX, AX 
    XOR BX, BX 
    XOR CX, CX 
    MOV CL, 2 
    MOV AL, byte ptr[nombre] 
    MOV DI, offset binaire 

; DIV : divide AX by CL. Remainder in AH and result in AL 

LOOP: 
    DIV CL ; remainder in AH, quotient in AL 
    ADD AH, '0' ; 0 -> '0' , 1 -> '1' 
    MOV [DI], AH ; Saves the remainder in the array 
    INC DI 
    MOV AH, 0 ; reset AH for next division 
    CMP AL, 0 ; if result is 0, end 
    JNE LOOP 

;Prints the binary number    
    MOV DX, offset binaire 
    CALL WRITE_STRING 

ありがとう!他に何かが必要な場合は、尋ねてください。

+1

複雑なアルゴリズムをアセンブラで直接実行しないでください。最初に高水準言語でアルゴリズムを開発し、それを翻訳します。 –

+0

...コンパイラに翻訳させてもらいます。 –

+0

アセンブラを学ぶなら、8086を学ばないでください。80x86、MIPS、ARM - *何でも16ビットDOS 808x;)良い参考資料、興味があれば:http://savannah.nongnu.org/projects/pgubook/ – paulsm4

答えて

2

値をバイナリまたは16進数で表示できるかどうかを心配する前に、コードがユーザーの入力を整数に正しく変換することを確認します(デバッガなど)。バイナリの場合

、このような何か考えてみます。

mov bx,ax    ;bx = the value to display as binary 
    mov cx,4    ;cx = number of nibbles to display 
    mov di,offset binaire ;es:di = address to store string 

.nextNibble: 
    mov ax,bx    ;ax = value 
    shr ax,12    ;ax = highest 4 bits of value 
    shl bx,4    ;bx = value << 4 
    add al,'0' 
    cmp al,'9' 
    jbe .gotChar 
    add al,'A' - '9' 
.gotChar: 
    stosb     ;Add new character to string 
    loop .nextBit 
    mov byte [di],0  ;Terminate the string (ASCIIZ?) 

    mov dx, offset binaire 
    call WRITE_STRING 

注1:I避難所進数の場合

mov bx,ax    ;bx = the value to display as binary 
    mov cx,16    ;cx = number of bits to display 
    mov di,offset binaire ;es:di = address to store string 

.nextBit: 
    xor ax,ax    ;al = 0 
    add bx,bx    ;bx = value * 2; carry flag = overflow 
    adc al,0    ;al = '0' or '1' 
    stosb     ;Add new character to string 
    loop .nextBit 
    mov byte [di],0  ;Terminate the string (ASCIIZ?) 

    mov dx, offset binaire 
    call WRITE_STRING 

をあなたは最高の4ビットを抽出する必要がある以外、それは、同じ基本的な考え方です上記のコードのどれかをテストしたのではなく、通常はNASM(MASMではなく)を使用しているため、「そのまま」アセンブルすることはできません。

注2:上記のコード例は意図的に単純です。パフォーマンスのために、ルックアップテーブルを使用するほうがずっと良いでしょう。

注3:これらは、複雑なアルゴリズムではなく、(あなたはおそらく、バイナリ/進変換の背後にある理論/数学を理解していない限り)あなたが最初にハイレベルの言語で約混乱する必要はありません。また、ある言語でエレガントに見えているアルゴリズムは、別の言語では醜い混乱になる可能性があります(例:Cで簡単でクリーンな方法でオーバーフローを検出できないため、上記のバイナリ変換で使用されるメソッドは明白でないC言語ではエレガントな別のメソッドがアセンブリで悪くなるかもしれません)。

+0

より効率的な: 'ROLのBXを、4'ので、別のシフトを必要とせずにコピーしてマスクすることができます。 –

関連する問題