Сборка ГАЗ Конвертер шестнадцатеричный для двоичного

Привет мне нужно разработать преобразователь шестнадцатеричного числа в двоичное число в сборке ГАЗ. Теперь у меня есть это:

.align 32

SYSEXIT = 1 
SYSREAD = 3
SYSWRITE = 4
STDOUT = 1
EXIT_SUCCESS = 0
Input_SIZE = 10

.bss
.lcomm Input, Input_SIZE

.data

msg: .ascii "Give hex number:\n"
msg_len = . - msg

newline: .ascii "\n"
    newline_len = . - newline

.text
.global _start

_start:

mov $SYSWRITE, %eax 
mov $STDOUT, %ebx 
mov $msg, %ecx 
mov $msg_len, %edx 
int $0x80

mov $SYSREAD, %eax 
mov $STDOUT, %ebx
mov $Input, %ecx
mov $Input_SIZE, %edx
int $0x80

    movl %eax, %edi
    movl %eax, %edx     
    dec %edx


loop1:
cmpl $1, %edx
je loop1_exit
movb Input(,%edx,1), %al


            cmpb 0x00, %al
            jl number
            cmpb 0x41, %al
            jg big_char 
            cmpb 0x46, %al
            jl big_char 
            cmpb 0x61, %al
            jg low_char 
            cmpb 0x66, %al
            jl low_char

jmp loop1

number:
    sub $'0', %al   
big_char:
    cmpb $'a', %al
    jae low_char
    sub $'A', %al
    add $10, %al

low_char:
    sub $'a', %al
    add $10, %al

loop1_exit:
movl $SYSWRITE, %eax
    movl $STDOUT, %ebx
    movl $newline, %ecx
    movl $newline_len, %edx
    int $0x80


    movl $SYSEXIT, %eax
    movl $EXIT_SUCCESS, %ebx
    int $0x80

и я понятия не имею, что делать дальше. Как напечатать мое двоичное число в программе. Я думаю, мне нужен второй цикл для печати каждой двоичной четверки. Это то, что у меня сейчас нормально?

1 ответ

Это то, что у меня сейчас нормально?

Запустите его в отладчике и попробуйте другие входные данные, посмотрите, будет ли результирующее состояние процессора таким, как вы ожидали (у меня есть подозрение, что это будет не совсем то, что вы ожидаете, и последуют некоторые изменения в коде).

Как напечатать мое двоичное число в программе.

For number 12345 (0x3039бинарный выход 11000000111001, Так как?

(начальная часть) Допустим, у вас есть значение в каком-то регистре r1. Установите какой-либо другой регистр r2 на ноль, кроме старшего бита, для чисел 32b r2 = 0x80000000.

to_binary_loop:
    test r1,r2   ; does bitwise AND, discards result, sets up flags
    output( zero_flag ? '0' : '1')
    shr  r2,1    ; moves the bit to right by 1 position
    jnz  to_binary_loop  ; loop till all bits were processed

Это также отобразит начальные нули для полного 32-битного двоичного вывода, например 00000000000000000011000000111001, Чтобы избежать этого, вы можете захотеть поставить еще один цикл перед первым:

to_binary_skip_leading_zeroes:
    test  r1,r2
    jnz   to_binary_found_leading_one
    shr   r2,1    ; next bit
    jnz   to_binary_skip_leading_zeroes
    ; no "1" bit found in r1, enforce at least single 0 to display
    mov   r2,1
to_binary_found_leading_one:

Тот output( zero_flag ? '0' : '1').. я бы лично написал как:

    ; somewhere defined (can be even in .text near the loop, read-only usage)
bin_digit: .ascii "01"

    ; in init of loop
    xor   r3,r3   ; pick one of eax,ebx,ecx,edx (spare one), set to zero

    ; during loop after "test r1,r2"
    setnz r3_byte_part
    mov   bin_digit(r3),al  ; al = '0' (ZF=1) or '1' (ZF=0)
    ; output char in "al"

К любой инструкции добавляйте суффиксы размера по мере необходимости, я не собираюсь мучить себя синтаксисом AT&T.

Другие вопросы по тегам