Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ассемблер _ Вывод чисел

Автор: CMOS 20.05.2006 18:19

Как в вывести числа в Ассемблере? Можно, конечно, взять число поделить на 10, к остатку прибавить 30h, затем частное снова поделить на 10 и т.д. Кстати, я на форуме видел что-то подобное. Но неужели мелкомягкие не предусмотрели для этого дела какой-нибудь функции?

Автор: volvo 20.05.2006 18:47

Цитата(CMOS @ 20.05.2006 14:19)
Как в вывести числа в Ассемблере? <...> Но неужели мелкомягкие не предусмотрели для этого дела какой-нибудь функции?
Во-первых, при чем здесь ассемблер и "мелкомягкие"? Вместо того, чтоб возмущаться, лучше бы назвал компилятор, которым пользуешься. MASM? Существует ассемблер НЕ только от MicroSoft... Возьми, например, TASM (или FASM, или NASM), и попробуй на нем сделать что-то...

Автор: CMOS 21.05.2006 0:01

Когда я вспоминал Майкрософтовцов я имел ввиду прерывания >21h.
Компилятор TAsm.

Автор: FreeMan 23.05.2006 21:18

wsprintf вроде имя этой функции. туда передается указатель на выходной буфер, на формат. строку... там не только числа в строку можно превратить. вобщем МСДН!

Автор: CMOS 23.05.2006 22:54

Цитата(FreeMan @ 23.05.2006 19:18) *

wsprintf вроде имя этой функции. туда передается указатель на выходной буфер, на формат. строку... там не только числа в строку можно превратить. вобщем МСДН!

Ты сейчас какой компилятор имел ввиду? Виндозовский?
Работаю под 16 бит в TAsm-e строго!

Автор: CRASH 24.05.2006 21:06

Цитата(CMOS @ 20.05.2006 18:19) *

Как в вывести числа в Ассемблере? Можно, конечно, взять число поделить на 10, к остатку прибавить 30h, затем частное снова поделить на 10 и т.д. Кстати, я на форуме видел что-то подобное. Но неужели мелкомягкие не предусмотрели для этого дела какой-нибудь функции?


А что тут сложного. Всё очень просто как 2x2. Напрмер, имеется значение в bl и переменная cnt - byte:


mov al, bl
aam ;корректируем значение в ax деля число на 10. (частное в al, остаток в ah)
or 3030h ;преобразуем число в символ таблицы ASCII путём "дорисовки" символа <3>
mov cnt, ah
mov cnt+1, al



Думаю тут всё просто и понятно.

Цитата(CMOS @ 20.05.2006 18:19) *

Как в вывести числа в Ассемблере? Можно, конечно, взять число поделить на 10, к остатку прибавить 30h, затем частное снова поделить на 10 и т.д. Кстати, я на форуме видел что-то подобное. Но неужели мелкомягкие не предусмотрели для этого дела какой-нибудь функции?


Забыл сказать: для простого вывода на монитор числа просто после помещения нужного значения в dl прибавляем к нему 30h (add dl, 30h).

Ну сейчас похоже и всё smile.gif

Автор: CMOS 27.05.2006 0:05

Да пробовал я это раньше. Работает только с байтами. Для слов подогнать не смог.
Ладно, вспомним старую добрую математику. Так надежней. Вот код (для 3х значных чисел), если кого интересует:

Код
mov ax, x
mov d, 100
mov cx, 3
repeat:
    mov dl, d
    div dl

    mov dl, al
    add dl, 30h
    mov al, ah
    mov ah, 0
    push ax
    mov ah, 2
    int 21h
    mov dl, 10
    
    mov ah, 0
    mov al, d
    div dl
    mov d, al
    pop ax
loop repeat

Автор: Malice 27.05.2006 1:10

А вот вывод 16-ричных чисел, даже попроще:

Код
mov       eax,01234DEADh
mov       cl,8
@1: rol       eax,4
push      eax
and       al,0Fh
cmp       al,0Ah
sbb       al,69h
das
int       029h
pop       eax
loop      @1

Автор: FreeMan 29.05.2006 13:07

http://wasm.ru/article.php?article=1022003