IntToStr:
; eax = number, ebx = base, edi = buffer
push ecx edx eax
xor ecx,ecx
.new:
xor edx,edx
div ebx
push edx
inc ecx
test eax,eax
jnz .new
.loop:
pop eax
add al,30h
cmp al,'9'
jng .ok
add al,7
.ok:
stosb
loop .loop
mov al,0
stosb
pop edx ecx eax
ret
Задача - DWORD to 4xASCII (Assembler)
Задача:
Перевод 4-байтового двоичного числа в цепочку ASCII-символов его шестнадцатеричного представления. Вывод результата в файл
Код:
Ну а с выводом в файл разобраться не сложно. См. API функции CreateFile и WriteFile из kernel32
Код:
IntToHex PROC
; in: EAX=number, EDI=buffer
; out: ECX=length
push eax
push edx
push edi
pushf
; get digit count
mov edx, 1
xor ecx, ecx
@inc_counter:
inc ecx
cmp ecx, 8
je @hex_trans
shl edx, 4
cmp edx, eax
jbe @inc_counter
; trans to hex
@hex_trans:
mov edx, eax
add edi, ecx
dec edi
std
@get_digit:
mov al, dl
and al, 0Fh
cmp al, 9
ja @is_letter
add al, '0'
jmp short @out_digit
@is_letter:
sub al, 10
add al, 'A'
@out_digit:
stosb
shr edx, 4
jnz @get_digit
; done
popf
pop edi
pop edx
pop eax
ret
IntToHex ENDP
; in: EAX=number, EDI=buffer
; out: ECX=length
push eax
push edx
push edi
pushf
; get digit count
mov edx, 1
xor ecx, ecx
@inc_counter:
inc ecx
cmp ecx, 8
je @hex_trans
shl edx, 4
cmp edx, eax
jbe @inc_counter
; trans to hex
@hex_trans:
mov edx, eax
add edi, ecx
dec edi
std
@get_digit:
mov al, dl
and al, 0Fh
cmp al, 9
ja @is_letter
add al, '0'
jmp short @out_digit
@is_letter:
sub al, 10
add al, 'A'
@out_digit:
stosb
shr edx, 4
jnz @get_digit
; done
popf
pop edi
pop edx
pop eax
ret
IntToHex ENDP
Перед вызовом в EAX нужно поместить число, а в EDI - адрес строки. Процедура преобразует число в HEX-строку и возвращает ее длину в ECX.
А что касается записи в файл - это зависит от ОС. В Windows, как уже было сказано, нужны функции CreateFile и WriteFile, подробнее см. "Уроки Iczelion'а". В DOS'е - через функции прерывания 21h, а в Linux'е - через C-библиотеку libc.
А не подскажите, как сделать так, чтобы ввод двоичных символов осуществлялся с клавиатуры...