Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Assembler] Перевод числа в строку


Автор: Trishi 5.5.2007, 19:33
Тут такое дело. Семестр уже к концу подходит, а ассемблер как был не понятен в начале, так и сейчас смутно с ним.  smile 
Вот задачка: "Задать целое число в регистре. Написать программу на ассемблере, которая преобразует данное число в текстовую строку (в десятичной системе) и выведет его на терминал. Число должно быть: целое 1 байт без знака." 
Если можно, напишите ее плиз, и с пояснениями, потому что разобраться все-таки хочется.   smile 
P.S. Теперь я тему правильно создала - надеюсь, кто-то поможет.

Автор: anwe 5.5.2007, 20:51
Код

    .model  tiny
    .186
    .code
    org    100h
start:
    mov    dl,5    ;произвольное число
    add    dl,30h    ;код чисел начинается с 30h, то есть 30h - 0, значит 35h - 5, то есть надо добавить 30h
    mov    ah,02h    ;ДОСовская функция вывода, что находится в регистре dl символа на экран
    int    21h
    ret
end    start

Автор: Trishi 5.5.2007, 21:19
У меня при команде линк выдается ворнинг: no stack segment    и при запуске просто мигает и все.

Автор: anwe 5.5.2007, 21:25
А как компилируешь. Это com-файл, не exe.

Автор: Trishi 5.5.2007, 21:31
Ну я сначала пишув мс-досе: "masm name.asm"
потом: "link name.obj"

А потом надо чтобы я его открыла и мне напечатало.

Автор: anwe 5.5.2007, 21:41
Тогда так:
Код

    .model  small
    .stack    10h
    .186
    .code
start:
    mov    dl,5    ;произвольное число
    add    dl,30h    ;код чисел начинается с 30h, то есть 30h - 0, 

значит 35h - 5, то есть надо добавить 30h
    mov    ah,02h    ;ДОСовская функция вывода, что находится в 

регистре dl символа на экран
    int    21h
    mov    ax,4C00h
    int    21h
end    start

Это ехе-файл.

Автор: JAPH 5.5.2007, 21:43
anwe
Код

mov  dl, 25

??

Код

cseg    segment
        assume  cs: cseg, ds: nothing, ss: sseg
@:      mov     al, 125
        aam
        mov     bh, al
        mov     al, ah
        aam
        mov     bl, al
        mov     dl, ah
        mov     ah, 02h
        add     dl, 30h
        add     bx, 3030h
        cmp     dl, 30h
        je      @1
        int     21h
        jmp     @2
@1:     cmp     bl, 30h
        je      @3
@2:     mov     dl, bl
        int     21h
@3:     mov     dl, bh
        int     21h
        mov     ax, 4C00h
        int     21h
cseg    ends
sseg    segment stack
        db      0400h dup (?)
sseg    ends
        end     @

Автор: Trishi 5.5.2007, 21:51
И первый, и второй вариант просто мигают и все(((

Автор: anwe 5.5.2007, 22:03
Это для ДОСа не для винды.

Автор: Trishi 5.5.2007, 22:13
А как для виндовса сделать?

Автор: anwe 5.5.2007, 22:21
Ты определись для чего тебе надо. Если это только начало, то обычно для ДОСа, чтобы понять суть. Но ты определись.

Автор: Trishi 5.5.2007, 22:29
Вообще-то у нас это начало. Но для виндовс надо. Чтобы запустить на виндовсе и нормально открылось окно и там число напечатанное было.

Автор: anwe 5.5.2007, 22:42
Для винды - консоль или полноценное окно?

Автор: Trishi 5.5.2007, 22:46
Самое простое - вот как типа в БорландС открывается. Это консоль, наверное, называется. Программу запускаешь - окно открывается, а потом энтер - и все.

Автор: anwe 5.5.2007, 22:55
Не, давай так.
Это подойдет. См. прилашаемый файлик.
Запускаешь сенс ДОС и комстроке прописываешь -> получаешь  результат smile 

Автор: Trishi 5.5.2007, 23:02
Спасибо! А именно код еще у тебя есть? Можешь и его еще прикрепить?

Автор: anwe 5.5.2007, 23:05
Так это JAPH спасибо. Его код. Смотри его сообщение. Для работы необходимо лишь добавить
Код

    .model  small
    .stack    10h
    .186
    .code
выше его строк.

Автор: Trishi 5.5.2007, 23:07
Добавляю - а экзешник не создается. Тоже ошибка там: "invalid object module"

Автор: JAPH 6.5.2007, 10:52
anwe, не согласен! Я использую полное определение сегментов, и мешать его с моделями не следует. Тем более .stack 10h и sseg segment stack ; db 0400h dup (?) немного противоречат друг другу.

Попробуйте:
Код

        .model  small
        .stack  400h
        .code
@:      mov     al, 125    
        aam    
        mov     bh, al    
        mov     al, ah    
        aam    
        mov     bl, al    
        mov     dl, ah    
        mov     ah, 02h    
        add     dl, 30h    
        add     bx, 3030h    
        cmp     dl, 30h    
        je      @1    
        int     21h    
        jmp     @2    
@1:     cmp     bl, 30h    
        je      @3    
@2:     mov     dl, bl    
        int     21h    
@3:     mov     dl, bh    
        int     21h    
        mov     ah, 08h
        int     21h
        mov     ax, 4C00h    
        int     21h    
        end     @

Окно закроется только после press any key.

Автор: Trishi 6.5.2007, 19:13
Спасибо! Я запустила - все работает. Только по ходу разбирание в программе возникло пару вопросов:

Код

mov     al, 125         1. Почему мы изначально записываем число именно в al, а не в dl

aam                         2. Для чего нужна эта команда

        mov     bh, al
        mov     al, ah   
        aam               
        mov     bl, al    
        mov     dl, ah    

        add     dl, 30h      

        add     bx, 3030h    3. Зачем мы это делаеми что такое 3030х

        cmp     dl, 30h          
        int     21h       
        jmp     @2    
@1:     cmp     bl, 30h    
        je      @3    
@2:     mov     dl, bl    
        int     21h    
@3:     mov     dl, bh    
        int     21h    

        mov     ah, 08h             4. Что означает эта команда?
        int     21h
        mov     ax, 4C00h            5. Что означает эта команда?
        int     21h    


6. В каком месте программы мы ставим задержку экрана до нажатия любой клавиши

7 - самый главный: Это и есть перевод числа в строку или это  только распечатка числа?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)