org 0x100
mov ax, cs
mov ds, ax
mov es, ax
mov ax, 10101010b
call num_to_str
mov ah, 9
mov dx, num_buffer
int 0x21
int 0x20
num_to_str:
push ax bx cx di
mov di, num_buffer + 15
std
mov cx, 16
@@:
shr ax, 1
push ax
setc al
add al, "0"
stosb
pop ax
loop @b
cld
pop di cx bx ax
ret
num_buffer db 16 dup (?)
db 0x24
Использование call\ret в ассемблере
Написать программу, выводящую двоичное представление регистра используя команды call\ret
Код:
Это пример для DOS на FASM. А вообще было бы хорошо указать на каком ассемблере и под какую операционную систему. Если под Windows, то всё оооочень просто (если конечно вам разрешат использовать wsprintf или его аналог)
Спасибо вам большое.Программа NASM под Linux используется Intel-синтаксис
Код:
... Где-то в секции кода ...
num_to_str:
push eax ebx ecx edi
mov edi, num_buffer + 31
std
mov ecx, 32
@@:
shr eax, 1
push eax
setc al
add al, "0"
stosb
pop eax
loop @b
cld
pop edi ecx ebx eax
ret
... Где-то в секции данных ...
num_buffer db 32 dup (?)
db 0
num_to_str:
push eax ebx ecx edi
mov edi, num_buffer + 31
std
mov ecx, 32
@@:
shr eax, 1
push eax
setc al
add al, "0"
stosb
pop eax
loop @b
cld
pop edi ecx ebx eax
ret
... Где-то в секции данных ...
num_buffer db 32 dup (?)
db 0
В EAX помещается нужно число. Затем делается call num_to_str и наконец вызывается функция вывода строки с указателем на num_buffer. Насчёт вывода не могу сказать конктено, потому что под Linux никогда не программировал. Там вроде как есть libc и соответственно можно написать:
Код:
mov eax, 0x12345678
call num_to_str
push num_buffer
call printf
add esp, 4 ; printf вызывается по соглашению ccall и мы должны освободить стек сами
call num_to_str
push num_buffer
call printf
add esp, 4 ; printf вызывается по соглашению ccall и мы должны освободить стек сами
Насчёт переноса этого кода на NASM: замените безымянную метку (@@ и @f) на другое имя. В NASM вроде как они не поддерживаются. Больше изменений, скорее всего, делать не придётся.
Цитата:
Спасибо вам большое
Читай мою подпись)