Другие языки программирования и технологии
Assembler (не знающим просьба не писать!!!)
пишем на С++, компилируем, получившийся код дизассемблируем и вуаля...
мда, я бы может и помог, если бы задачу понял.
; Число в BCD-формате
Data_BCD DT 0
; 32-разрядное целое число
Data_Int32 DD 0
;результат
Data_String db 24 dup(0)
;***************************************************
;* ПРЕОБРАЗОВАТЬ 32-РАЗРЯДНОЕ ЦЕЛОЕ ЧИСЛО В СТРОКУ *
;* Входные параметры: *
;* Data_Int32 - 32-разрядное число. *
;* Выходные параметры: *
;* Data_String - строка-результат. *
;***************************************************
PROC Int32_to_String near
mov [Data_Int32],eax ;вот тут наше число в регистре еах
cld
; Перевести число из двоичного кода в код BCD
fninit ;сброс сопроцессора
; Загрузить число в двоичном коде
fild [Data_Int32]
; Извлечь число в коде BCD
fbstp [Data_BCD]
; Результат записывать в строку Data_String
mov EDI,offset Data_String
call BCD_to_ASCII
; Записать признак конца строки (код 0)
xor AL,AL
stosb
ret
ENDP Int32_to_String
;****************************************************
;* ПРЕОБРАЗОВАТЬ ЧИСЛО ИЗ КОДА BCD В КОД ASCII *
;* (вспомогательная функция, регистры не сохраняет) *
;* Входные параметры: *
;* Data_BCD - число в BCD-формате. *
;* Регистр EDI - указатель на строку результата. *
;****************************************************
PROC BCD_to_ASCII near
; Выделить знак числа и записать его в ASCII-коде
mov AL,[offset Data_BCD + 9]
and AL,AL
jz @@n0
mov AL,'-'
stosb
; Пропустить незначащие (нулевые) разряды слева
@@n0: mov EBX,8
mov ECX,9
@@n1: ;проверяем на 0 очередную пару разрядов
cmp [byte ptr EBX+offset Data_BCD],0
jne @@n2
dec EBX
loop @@n1
; Если значение числа равно нулю, записать символ
; нуля в строку результата и выйти из программы
mov AL,'0'
stosb
jmp short @@End
; Пропустить незначащий ноль в старшей
; тетраде (если он есть)
@@n2: ; Загрузить первую значащую пару разрядов
mov AL,[EBX + offset Data_BCD]
mov dl,AL
; Выделить, перевести в ASCII и
; сохранить старшую тетраду
shr AL,4
cmp AL,0
; Если 0 - пропустить старшую тетраду
je @@n3
add AL,'0'
stosb
; Выделить, перевести в ASCII и
; сохранить младшую тетраду
@@n3: mov AL,dl
and AL,0Fh
add AL,'0'
stosb
dec EBX
dec ECX
jz @@End ;выход, если это последний разряд
; Распаковать остальные разряды числа (если они есть)
@@n4: ; Загрузить очередную пару разрядов
mov AL,[BX + offset Data_BCD]
mov dl,AL
; Выделить, перевести в ASCII и
; сохранить старшую тетраду
shr AL,4
add AL,'0'
stosb
; Выделить, перевести в ASCII и
; сохранить младшую тетраду
mov AL,dl
and AL,0Fh
add AL,'0'
stosb
dec EBX
loop @@n4
@@End:
ret
ENDP BCD_to_ASCII
Data_BCD DT 0
; 32-разрядное целое число
Data_Int32 DD 0
;результат
Data_String db 24 dup(0)
;***************************************************
;* ПРЕОБРАЗОВАТЬ 32-РАЗРЯДНОЕ ЦЕЛОЕ ЧИСЛО В СТРОКУ *
;* Входные параметры: *
;* Data_Int32 - 32-разрядное число. *
;* Выходные параметры: *
;* Data_String - строка-результат. *
;***************************************************
PROC Int32_to_String near
mov [Data_Int32],eax ;вот тут наше число в регистре еах
cld
; Перевести число из двоичного кода в код BCD
fninit ;сброс сопроцессора
; Загрузить число в двоичном коде
fild [Data_Int32]
; Извлечь число в коде BCD
fbstp [Data_BCD]
; Результат записывать в строку Data_String
mov EDI,offset Data_String
call BCD_to_ASCII
; Записать признак конца строки (код 0)
xor AL,AL
stosb
ret
ENDP Int32_to_String
;****************************************************
;* ПРЕОБРАЗОВАТЬ ЧИСЛО ИЗ КОДА BCD В КОД ASCII *
;* (вспомогательная функция, регистры не сохраняет) *
;* Входные параметры: *
;* Data_BCD - число в BCD-формате. *
;* Регистр EDI - указатель на строку результата. *
;****************************************************
PROC BCD_to_ASCII near
; Выделить знак числа и записать его в ASCII-коде
mov AL,[offset Data_BCD + 9]
and AL,AL
jz @@n0
mov AL,'-'
stosb
; Пропустить незначащие (нулевые) разряды слева
@@n0: mov EBX,8
mov ECX,9
@@n1: ;проверяем на 0 очередную пару разрядов
cmp [byte ptr EBX+offset Data_BCD],0
jne @@n2
dec EBX
loop @@n1
; Если значение числа равно нулю, записать символ
; нуля в строку результата и выйти из программы
mov AL,'0'
stosb
jmp short @@End
; Пропустить незначащий ноль в старшей
; тетраде (если он есть)
@@n2: ; Загрузить первую значащую пару разрядов
mov AL,[EBX + offset Data_BCD]
mov dl,AL
; Выделить, перевести в ASCII и
; сохранить старшую тетраду
shr AL,4
cmp AL,0
; Если 0 - пропустить старшую тетраду
je @@n3
add AL,'0'
stosb
; Выделить, перевести в ASCII и
; сохранить младшую тетраду
@@n3: mov AL,dl
and AL,0Fh
add AL,'0'
stosb
dec EBX
dec ECX
jz @@End ;выход, если это последний разряд
; Распаковать остальные разряды числа (если они есть)
@@n4: ; Загрузить очередную пару разрядов
mov AL,[BX + offset Data_BCD]
mov dl,AL
; Выделить, перевести в ASCII и
; сохранить старшую тетраду
shr AL,4
add AL,'0'
stosb
; Выделить, перевести в ASCII и
; сохранить младшую тетраду
mov AL,dl
and AL,0Fh
add AL,'0'
stosb
dec EBX
loop @@n4
@@End:
ret
ENDP BCD_to_ASCII
Похожие вопросы
- Подскажите пожалуйста пока еще не вырос.Вот хочу быть программистом, а не знаю на чём писать скрипты:на дельфи?на с++?
- Вот как ребёнок хочу стать хакером высшего уровня Но не знаю что лучше писать игры программы или взламывать сайты?
- Скажите мне истинные программисты, стоит ли изучать Assembler, если ты знаешь другие ЯП?
- Assembler или C для микроконтроллеров?
- При делении отрицательного числа выводит не правильный ответ (assembler). Если беру числа 127 13 10, пишет переполнение
- Assembler помогите создать файлы *.obj *.exe
- какой язык легче выучить.C++ или Assembler? какой язык легче выучить.C++ или Assembler?
- Подскажите, правильно ли? assembler
- Assembler. HEEEEEEEEEEEEELP! дан одномерный массив найти количество и сумму нечетных элементов assembler
- Как написать программу для assembler (ассемблер)?