Строка десятичного числа к двоичному и гекса в сборке 8086 - PullRequest
0 голосов
/ 17 марта 2012

Я пытаюсь преобразовать строку, которую я прочитал с этим кодом, в двоичный код и в гекса.

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" (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 Ответ

2 голосов
/ 18 марта 2012

Прежде чем беспокоиться о том, можете ли вы отображать значение как двоичное или шестнадцатеричное;проверьте, чтобы убедиться, что ваш код правильно преобразует введенные пользователем данные в целое число (например, с помощью отладчика).

Для двоичного кода рассмотрите что-то вроде этого:

    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 бита:

    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. Я не проверял ни один из приведенных выше кодов и обычно использую NASM (не MASM), поэтому он может несобрать "как есть".

Примечание 2: Пример кода выше преднамеренно прост.Для повышения производительности вы могли бы гораздо лучше использовать справочные таблицы.

Примечание 3: Это не сложные алгоритмы, и вам не нужно сначала возиться с языками высокого уровня (если вы не понимаететеория / математика позади двоичного / шестнадцатеричного преобразования возможно).Кроме того, алгоритм, который кажется элегантным на одном языке, может быть ужасным беспорядком на другом языке (например, вы не можете обнаружить переполнение простым / чистым способом в C, поэтому метод, используемый для двоичного преобразования выше, не будет очевидным или элегантнымв C и другой элегантный метод в C может плохо сосать при сборке).

...