Смекни!
smekni.com

Программа перевода десятичного числа в двоичную и шестнадцатеричную системы счисления (стр. 2 из 2)

2.                Разработка текстапрограмм.

3.                Ввод текста вкомпьютер. Текст программы в мнемокодах вводится в ЭВМ при помощи любоготекстового редактора. Так же при этом создает ся текстовый Файл с расширением*.ASM .

4.                Компиляция илиассемблирование. Осуществляется преобразование текстового Файла с расширением*.ASM в объектный Файл, содержащийпрограмму в машинном коде с расширением *.OBJ . Так же на этом этапе может быть создан листингпрограммы. Файл с расширением *.LST,в котором содержится основная информация о программе, а так же Файлперекрёстных ссылок с расширением *.CRF.На этом этапе происходит проварка текста программ на наличие ошибок.Ассемблирование осуществляется при помощи программы транслятора TASM.EXE (ASM.EXE – в ассемблере, MASM.EXE - в макроассемблере). TASM [опции] *.ASM [,,] - команда для выполнения трансляции. Если в командеуказана одна запятая, то Файл листинга Формируется. В TASM имеются две опции: /ZI и /N.Они вызываются: ТАSМ.

5.                Компоновка. На этом этапе создается перемещаемая программа способная загружатьсяа любую область памяти. Сохраняется в Файле с расширением *.ЕХЕ или *.СОМ. Дляэтого используется TLINK.exe (для макроассемблера LINK.EXE). Имеются опции:/Т и /X.

6.                Выполнение иотладка (DEBUG).

7.                Занесениемашинного кода программы в ПЗУ (может отсутствовать) Теперь мы посмотримблок-схему нашей программы, то есть упорядоченные действия.


;ПРОГРАММАПЕРЕВОДА ДЕСЯТИЧНОГО ЧИСЛА В ;ДВОИЧНУЮИ ШЕСТНАДЦАТЕРИЧНУЮ СИСТЕМЫ ;СЧИСЛЕНИЯ

.MODEL small

.STACK 64

.DATA

;Сегментданных

;____________________________________________________________________

;Таблица преобразования “цифра– ASCII-код

        org                      100h

        tabl_ascii  db                 '0123456789abcdef'

;____________________________________________________________________

;Таблица преобразования “ASCII-код- цифра

        org                      130h

        db                        0,1,2,3,4,5,6,7,8,9

        org                      41h

        db                        0ah,0bh,0ch, 0dh, 0eh, 0fh

;____________________________________________________________________

;Резервация и инициализацияпеременных в памяти

        org                      150h

        x_ascii     db                  20hdup(?)

        t1            db      0dh,0ah,"Введите число и нажмите Enter"

                       db        0dh, 0ah, "$"

        t2             db      0dh,0ah,"Вы ввели число”,0dh,0ah"$"

        t3            db      0dh, 0ah, "В двоичной системе оно выглядет так"

                       db        0dh,0ah,"$"

        t4            db      0dh, 0ah, "В шестнадцатеричной так"

                        db       0dh, 0ah, "$"

bufdb 16 dup(?),"$"

        t5            db      0dh,0ah, "Будем продолжать процесс?(Y/N)?"

                       db        0dh,0ah,"$"

;____________________________________________________________________

 

;Сегменткодов

.CODE

;Главная процедура 

  g_k proc

       mov                     ax,@data

       mov                     ds, ax

        mov                                es, ax

  d:  lea                     dx, t1

       mov                     ah,09h

        int                        21h

       lea                       di, x_ascii

       call                     ink

       call                     des_2

       push                  ax

       lea                       dx,t3

       mov                     ah,9h

        int                        21h

       pop                    ax

       call                     bin_dis

        push                              ax

       lea                       dx,t4

       mov                     ah,9h

       int                        21h

        pop                                ax

       call                      outhex

       lea                       dx,t5

       mov                     ah,9h

       int                        21h

       mov                     ah,1h

       int                        21h

        cmp                     al,"Y"

        loope                  d

        cmp                                 al,"y"

        loop                                d

        mov                                 ah,4ch

        int                        21h

  g_k endp

  ink proc

;Процедура ввода десятичногочисла 

        xor                      cx,cx

  l1:

        mov                    ah,1

        int                                    21h

        stosb

        inc                                   cx

        cmp                                 al,0dh

        jnz                                   l1

        dec                                  cx

        ret

  ink endp

  dis proc

 ;Процедура вывода на экрандесятичного числа 

  r1: mov                                dl,[di]

        mov                                 ah,2

        int                        21h

        inc                       di

        loop                                r1

        ret

  dis endp

  des_2 proc

;Переводчисла(десятичного) в двоичную систему

        mov                     si,10

        lea                       di,x_ascii

        sub                     ax,ax

  v1: mul                    si

        mov                     bp,ax

        mov                     al,[di]

        sub                     al,48

        inc                       di

        mov                    ah,ch

        add                     ax,bp

        loop                    v1

        ret

  des_2 endp

  bin_dis proc

  ;Процедура вывода на экрандвоичного числа

        lea                       di,buf

        mov                     cx,16

        mov                     bx,ax

        mov                    dx,ax

conv:

        mov                    al,ch

        shl                       dx,1

        adc                     al,'0'

        stosb      

        loop                    conv

        mov                     ah,9h

        lea                       dx,buf

        int                        21h

        mov                    ax,bx

        ret

  bin_dis endp

;Процедураперевода числа(двоичного)в шестнадцатеричную

;ивывод его на экран

outhex:

mov                ch,al

            mov                al,ah

            mov                ah,2

            call                 prnbh

            mov                al,ch

prnbh:

            mov                 dh,al

            shr                 al,1

            shr                 al,1

            shr                 al,1

            shr                 al,1

            call                 prnd

            mov                al,dh

            and                al,15

prnd: 

or                    al,48

            cmp                al,58

            jc                     prnc

            add                al,7

prnc: 

mov                 dl,al

            int                   33

            ret

           

  end g_k

Примечания:

Ниже привединыкоманды использовались в программе:

    sub     – двоичное вычитание. Вычитаетсяиз первого операнда содержимое второго  операнда

Мнемоника:    sub<операнд1>,<операнд 2>

call      – вызов процедуры. Передает управлениепроцедуре адрес которой задан операндом, после завершения процедуры, выполнениепродолжается командой следующей за командой call

Мнемоника:    call<имяпроцедуры>

ret       – возврат к процедуре

shr      – сдвинуть логическивправо

xor      – исключающее ИЛИ

Мнемоника:    xor<операнд 1>,<операнд 2>

lea      – загрузить ЕА

Мнемоника:    leareg,<операнд>

push   – включить в stack

Мнемоника:    push<операнд>

pop     – извлечь из stack

Мнемоника:    pop<операнд>

mov    – переслать

Мнемоника:    mov<приемник>,<источник>

inc      – увеличение на 1

Мнемоника:    inc<операнд>

dec     – уменьшение на 1

Мнемоника:    dec<операнд>

stosb – пересылает соединениярегистра al или ax накоторый указывает регистр di

loop    – команда организации цикла со счетчиком,также короткие переходы (127б)  команда уменьшает значение счетчика cx, без изменениякаких-либо флагов, если соединение cx >0, то осуществляетсяпереход на заданную метку, в противном случае цикл завершается.

Мнемоника:    loop <метка>

.CODE                – открывает сегменткода

.DATA                -- открывает сегментданных

.STACK  N         определяетсегмент stack(а); дерективы закрытиясегментов в этом случае не используются; N – показывает размер stack(a) в байтах

Примечание: при использованиитаких деректив регистр ds инициализируется следующим образом:                 mov                ax,@data

mov                ds,ax

assume в этом случае неиспользуется

Списоклитературы

1.  "Я зыкассемблера для IBM PC и программирования" Высшая школа 1992.

2.  "Персональный компьютер Фирмы IBM и операционная системаMS-DOS" Радио и связь 1991.

3.  ИлюшечкинВ.Н., Костин А.Е, Хохлов М.М. “Системноепрограммное обеспечение“,М ., “Высшая школа”,1987 г.

4.   НортонП., Соухэ Д. “Язык ассемблера для IBM PC”,М., Издательство “Компьютер”,1993