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

Assembler (не знающим просьба не писать!!!)

пишем на С++, компилируем, получившийся код дизассемблируем и вуаля...
Владимир Гавриленко
Владимир Гавриленко
1 265
Лучший ответ
мда, я бы может и помог, если бы задачу понял.
Сергей Star
Сергей Star
6 287
; Число в 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