Сборка ГАЗ Конвертер шестнадцатеричный для двоичного
Привет мне нужно разработать преобразователь шестнадцатеричного числа в двоичное число в сборке ГАЗ. Теперь у меня есть это:
.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.