Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.06.2012, 21:04   #1
idShura
 
Регистрация: 11.06.2012
Сообщений: 6
По умолчанию Перевод из десятеричной в двоичную систему счисления

Написал программу по примерам из интернета, и не могу разобраться с процедурой перевода числа из десятичной в двоичную систему счисления. Проблемы следующие:

1. Программа зацикливается. Хотя судя по команде mov cx,16 должно быть 16 циклов
2. Вместо 0 и 1 выводится 48 и 49. Судя по всему неправильно написан формат вывода formats db '%d',0 (не нашел документацию)


Код:
.386    
.model flat, stdcall
option casemap:none

;----------------------------------------------------------------------------------
;Подключаем необходимые библиотеки
include C:/masm32/include/windows.inc   ; infinite, invoke, и т.д.
include C:/masm32/include/kernel32.inc  ; SetConsoleTitle, Sleep, ExitProcess
include C:/masm32/include/msvcrt.inc    ; crt_printf\crt_scanf
 
includelib C:/masm32/lib/kernel32.lib   ; SetConsoleTitle, Sleep, ExitProcess
includelib C:/masm32/lib/msvcrt.lib     ; crt_printf\crt_scanf
;----------------------------------------------------------------------------------
.data
formats  db '%d',0

.data?

.code
main:

...

call OutBin

OutBin proc
 
    mov bx,ax
    mov cx,16
ob1:
    shl bx,1
    jc ob2
    
    mov dl,'0'
    jmp ob3
    
ob2:
    mov dl,'1'
ob3:
    mov ah,2
    
    invoke  crt_printf, addr formats, dl
    loop ob1
    
OutBin endp

invoke Sleep, INFINITE
invoke ExitProcess,0

end main
idShura вне форума Ответить с цитированием
Старый 12.06.2012, 21:33   #2
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Попробуй в начале OutBin сделать:
Код:
хор edx, edx
а в строчке invoke crt_printf, addr formats, dl поемнять dl<=>edx:
Код:
 invoke  crt_printf, addr formats, edx
rlib вне форума Ответить с цитированием
Старый 12.06.2012, 21:54   #3
idShura
 
Регистрация: 11.06.2012
Сообщений: 6
По умолчанию

rlib - не помогло
idShura вне форума Ответить с цитированием
Старый 12.06.2012, 23:40   #4
rlib
Форумчанин
 
Аватар для rlib
 
Регистрация: 22.05.2012
Сообщений: 352
По умолчанию

Цитата:
Сообщение от idShura Посмотреть сообщение
rlib - не помогло

Напиши полный код, с main()
rlib вне форума Ответить с цитированием
Старый 13.06.2012, 06:13   #5
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

idShura,
1. Во-первых, что в старшей части ecx? Во-вторых, его значение портится при вызове функций.
2. Зачем писать- "не нашёл документации" . Напишите как есть - не искал. Тайна за семью замками.

Код:
.data
formats  db '%s',0
symbol db 2 dup (0)

.data? 

.code
main:

...

call OutBin

OutBin proc
 
    mov bx,ax
    mov ecx,16
ob1:
    push ecx
    shl bx,1
    jc ob2
    
    mov symbol ,'0'
    jmp ob3
    
ob2:
    mov symbol ,'1'
ob3:
    mov ah,2
    
    invoke  crt_printf, addr formats, addr symbol
    pop ecx
    loop ob1
    
OutBin endp

invoke Sleep, INFINITE
invoke ExitProcess,0

end main

Последний раз редактировалось vadimych; 13.06.2012 в 06:28.
vadimych вне форума Ответить с цитированием
Старый 13.06.2012, 07:28   #6
idShura
 
Регистрация: 11.06.2012
Сообщений: 6
По умолчанию

vadimych - Спасибо, заработало) Получается для того чтобы не зацикливалась программа нужно было сохранять счетчик.

А вот этот кусок я не понял, можно его прокоментировать:
Код:
formats  db '%s',0
symbol db 2 dup (0)
idShura вне форума Ответить с цитированием
Старый 13.06.2012, 09:37   #7
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

idShura, по ссылке сходите, почитайте википедию. В мсдн посмотрите, наконец.
В Вашем случае, поскольку выводится символ, можно вообще написать просто
Код:
invoke  crt_printf, addr symbol
без всяких formats.
vadimych вне форума Ответить с цитированием
Старый 13.06.2012, 12:35   #8
Fatal Error
Пользователь
 
Аватар для Fatal Error
 
Регистрация: 20.05.2012
Сообщений: 58
По умолчанию

Вадимыч, цто это((((( jc, mov simbol, '0'??????? Зачем??
Xor dx, dx
shl bx, 1
adc dl, 30h
int 21h
Fatal Error вне форума Ответить с цитированием
Старый 13.06.2012, 14:18   #9
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Искандар, ты точно у меня это хотел спросить?
vadimych вне форума Ответить с цитированием
Старый 13.06.2012, 14:25   #10
Fatal Error
Пользователь
 
Аватар для Fatal Error
 
Регистрация: 20.05.2012
Сообщений: 58
По умолчанию

Да, точно... Зачем лишние инструкции и переходы. Мой код компактнее)
Fatal Error вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перевод числа в двоичную систему lord2012 Помощь студентам 2 15.05.2012 06:57
Перевод из десятичной в двоичную систему diflesh2008 Помощь студентам 12 31.12.2010 15:38
Строка неограниченной длины char в двоичную систему счисления mizantrop32 Общие вопросы C/C++ 3 07.11.2010 16:17