Другие языки программирования и технологии

как заставить ету прогу упак и неупак. BCD (асемблер, масм32)

как заставить ету прогу представить десятичное число в упак. и неупак BCD . прога:
.386
.model flat,stdcall
option casemap:none

includelib \masm32\lib\kernel32.lib;подключаем необходимые файлы
includelib \masm32\lib\masm32.lib
includelib \masm32\lib\msvcrt.lib

include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
include \masm32\include\masm32.inc
include \masm32\include\msvcrt.inc

.data
sPrompt db 'Enter integer =>',0 ;приглашение ввода
sInputdb '%d',0 ;форматная строка ввода числа
sOutput db 'Count of "1" = %d',0 ;форматная строка вывода результата
sBinary db 'Number in binary format is %s',0 ;для вывода числа в двоичной системе счисления
numdd 0 ;здесь храним введенное число
out_buf db 32 dup (0),0dh,0ah,0 ;здесь будем формировать двоичное представление числа

.code
Main proc
invoke crt_printf,ADDR sPrompt ;пригласим ввести число
invoke crt_scanf,ADDR sInput,ADDR num ;считаем число с клавиатуры

;теперь покажем число в двоичной системе счисления
;в этой секции мы преобразуем введенное число в строку в двоичной системе счисления -- для наглядности
mov ecx,32
mov edx,offset out_buf
mov ebx,[num]

@@loop:
rol ebx,1 ;в цикле 32 раза прокручиваем число влево с копированием MSB в флаг CF
jnc @@zero
mov al,'1' ;если CF=1, то добавляем в буфер "1"
mov [edx],al
jmp @@continue
@@zero:
mov al,'0' ;если CF=0,то в буфер добавляем "0"
mov [edx],al
@@continue:
inc edx
dec ecx
jcxz @@forward
jmp @@loop
@@forward:
;выведем введенное число в двоичной системе счисления на экран
invoke crt_printf,ADDR sBinary,ADDR out_buf

@@nomore:
;выводим результат на экран
;задержка в 5 секунд - чтобы успеть рассмотреть результат
invoke Sleep,5000d
invoke ExitProcess,NULL ;завершаем работу
Main endp
End Main
Ellan Gadjiev
Ellan Gadjiev
1 221
.386
.model flat,stdcall
option casemap:none

include windows.inc
include kernel32.inc
include msvcrt.inc
includelib kernel32.lib
includelib msvcrt.lib

.stack 100h

.data
sPrompt db 'Enter integer =>',0
sInput db '%d',0
sOutput db 'Count of "1" = %d',0
sBinary db 'Number in binary format is %s',0
sPBCD db 'Number in packed BCD is %s',0
sUBCD db 'Number in unpacked BCD is %s',0
num dd 0
out_buf db 32 dup (?),0dh,0ah,0

.code
;Подпрограмма формирования двоичного представления ebx
ToBin proc
lea edi,out_buf
mov ecx,32
@@loop:
rol ebx,1
setc al
or al,'0'
stosb
loop @@loop
ret
ToBin endp

;Подпрограмма формирования BCD-кода
;eax - число, ebx=1 - упакованный BCD, =2 - неупакованный
;Результат eax - число в BCD-коде
ToBCD proc
mov esi,10
xor edi,edi
mov ecx,3
sub ecx,ebx
shl ecx,2
DoLoop:
push ecx
cdq
div esi
or edi,edx
mov ecx,ebx
shl ecx,2
ror edi,cl
pop ecx
loop DoLoop
mov eax,edi
ret
ToBCD endp

Main proc
invoke crt_printf,ADDR sPrompt
invoke crt_scanf,ADDR sInput,ADDR num

mov ebx,num
call ToBin
invoke crt_printf,ADDR sBinary,ADDR out_buf
mov eax,num
mov ebx,1
call ToBCD
mov ebx,eax
call ToBin
invoke crt_printf,ADDR sPBCD,ADDR out_buf
mov eax,num
mov ebx,2
call ToBCD
mov ebx,eax
call ToBin
invoke crt_printf,ADDR sUBCD,ADDR out_buf

invoke Sleep,5000
invoke ExitProcess,NULL
Main endp
End Main



P.S. Программа корректно работает только с числами от 0 до 9999.
D. S.
D. S.
51 590
Лучший ответ