как заставить ету прогу представить десятичное число в упак. и неупак 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
Другие языки программирования и технологии
как заставить ету прогу упак и неупак. BCD (асемблер, масм32)
.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.
.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.
Похожие вопросы
- как найти количество максимальных элементов в массиве? на асемблере. на асемблере
- Где в Visual Studio 2012 дизассемблер? надо посмотреть что компилирует масм32 при .IF... .ELSEIF...
- Я внутри написал, что я знаю про паскаль не то что решать и все такое а так теоретический в общем, смысл проги, я прав?
- с какого языка програмирования стоит начать? с С++ или асемблера??
- напишите проги в ПАСКАЛЕ плиз!!!очень надо.
- Решение уравнения методом Ньютона (в С++). Как задать в проге отрезок,содержащий корень?
- //////////////////Маленький вопрос по АСЕМБЛЕРУ\\\\\\\\\\\\\\\\\
- Очень нужна помощь....Асемблер(tasm)
- асемблер ошибка
- Помогите пожалуйста с задачей по асемблеру. Построить конкатенацию (последовательную запись) файла TWO сомого с собой.