Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Использование call\ret в ассемблере

60K
18 мая 2010 года
heogay_811
2 / / 18.05.2010
Написать программу, выводящую двоичное представление регистра используя команды call\ret
399
19 мая 2010 года
KIV
432 / / 20.01.2009
Код:
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

Это пример для DOS на FASM. А вообще было бы хорошо указать на каком ассемблере и под какую операционную систему. Если под Windows, то всё оооочень просто (если конечно вам разрешат использовать wsprintf или его аналог)
60K
19 мая 2010 года
heogay_811
2 / / 18.05.2010
Спасибо вам большое.Программа NASM под Linux используется Intel-синтаксис
399
19 мая 2010 года
KIV
432 / / 20.01.2009
Перевод числа в строку будет так:
Код:
... Где-то в секции кода ...
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 и мы должны освободить стек сами

Насчёт переноса этого кода на NASM: замените безымянную метку (@@ и @f) на другое имя. В NASM вроде как они не поддерживаются. Больше изменений, скорее всего, делать не придётся.
Цитата:
Спасибо вам большое


Читай мою подпись)

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог