Главная страница
Навигация по странице:

  • Цель работы

  • Листинг программы Unsigned word ASM

  • Таблица результатов

  • Ответ : 1ACM: 1 100 100 Ответ

  • Лабораторная работа 3 Цель работы


    Скачать 32.59 Kb.
    НазваниеЛабораторная работа 3 Цель работы
    Дата16.05.2018
    Размер32.59 Kb.
    Формат файлаdocx
    Имя файлаlaba_3.docx
    ТипЛабораторная работа
    #43982

    Петров Ф.А. ИКПИ-72

    Ввод и вывод на ассемблере

    (лабораторная работа №3)
    Цель работы:

    Реализовать целочисленные вычисления, сделанные в лабораторной работе №1 или №2(по указанию преподавателя), полностью используя язык Ассемблера для организации корректного ввода-вывода информации:

    • исходные данные должны вводиться с проверкой правильности вводимых

    символов;

    • входные данные и результат должны быть проверены на область допустимых

    значений;

    • при наличии ошибки должно быть выдано соответствующее сообщение;

    • реализация задачи должна быть выполнена для MS DOS.


    Вариант №20: (b+a)/(a-1), a>b

    23, a=b

    b*b/8, a
    Листинг программы

    Unsigned word

    ASM:

    assume cs:code, ds:data

    code segment

    begin:

    jmp main

    ;Начальные параметры для работы InNumber

    chislo dw 0

    mult10 dw 1

    main proc near

    mov ax, data

    mov ds,Ax

    ;Вводим данные

    ;=====================================

    ;Вводим первое число

    mov ah, 09h

    lea dx, msg1

    int 21h
    mov ah, 0ah

    lea dx,param

    int 21h

    ;Передаём параметры для InNumber

    lea si,field -1

    mov bh,0

    mov bl, actlen

    ;Переводим введённое число в обычное

    call InNumber

    mov ax,chislo

    mov a1,ax

    ;Теперь в a1 введённое число

    ;=====================================
    ;=====================================

    ;Вводим второе число

    ;Подчистим параметры после первого ввода:

    mov chislo,0

    mov mult10,1

    ;Переводим каретку на новую строку:

    mov ah, 09h

    lea dx,new_line

    int 21h

    mov ah, 09h

    lea dx, msg2

    int 21h

    ;Осуществляем ввод:

    mov ah, 0ah

    lea dx,param

    int 21h
    ;Обработаем поступившее число:

    ;Передаём параметры:

    lea si,field - 1

    mov bh,0

    mov bl, actlen

    ;Вызываем функцию обработки:

    call InNumber

    ;Выпишем результат:

    mov ax,chislo

    mov a2,ax

    ;Теперь в a2 второе число

    ;=====================================
    ;Теперь используем программу второй лабораторной:

    ;Обработка данных:

    ;=====================================
    mov BX, a1

    mov CX, a2

    cmp BX, CX

    JG More

    JL Less

    JE Equal
    ;__________________________________________

    ;В случае, если a>b, то (b+a)/(a-1)

    More:

    mov ax, a2

    cwd

    add ax, a1

    cwd

    mov bx, a1

    sub bl, 1

    idiv bx

    cwd

    mov word ptr chislo, ax

    mov word ptr chislo+2, dx

    jmp output

    ;__________________________________________
    ;__________________________________________

    Less: ;В случае если a < b, то b*b/8

    mov ax, a2

    cwd

    mov bx, a2

    imul bx

    mov bx, 8

    idiv bx

    cwd

    mov word ptr chislo, ax

    mov word ptr chislo+2, dx

    jmp output

    ;__________________________________________

    ;__________________________________________

    ;В случае если a == b, то 23
    Equal:

    mov ax, 23

    mov dx, 0

    mov word ptr chislo, ax

    mov word ptr chislo+2, dx

    ;__________________________________________
    ;=====================================

    ;Вывод данных:

    ;=====================================

    output:

    mov chislo, ax

    ;Вызываем функцию преобразования числа в ASCII

    call FromNumber
    ;Переводи каретку на новую строку:

    mov ah, 09h

    lea dx,new_line

    int 21h
    ;Выводим сообщение и сам ответ:

    mov ah, 09h

    lea dx, msg

    int 21h

    mov ah, 09h

    lea dx,otvet

    int 21h

    ;завершаем работу программы

    mov ah, 0ah

    lea dx,param

    int 21h

    mov ax,4c00h

    int 21h

    ret

    main endp

    ;=====================================
    ;=============================================

    ;Функция преобразует ASCII число в десятичное

    ;=============================================

    InNumber proc

    ;Запишем множитель

    mov cx,10
    ;Организуем цикл

    b20:

    mov al,[si+bx] ;выписываем ASCII-код очередной цифры

    and ax, 000fh ;Оставляем само число от ASCII кода

    mul mult10 ;Домножаем его

    add chislo, ax

    mov ax,mult10;

    mul cx

    mov mult10,ax

    dec bx

    jnz b20
    ret

    InNumber endp

    ;=============================================
    ;=============================================

    ;Преобразует десятичное число в ASCII число

    ;=============================================

    FromNumber proc

    mov cx,0010;

    lea si, otvet + 5

    mov ax,chislo

    ;Нужно обработать ситуацию, когда число отрицательное:

    mov bx, ax

    and bx, 8000h ;Оставляем только знаковый бит 80000h=1000000000000000B

    cmp bx, 8000h ;Определяем, есть ли еденичка (-) или нет (+)

    jb plus ;Еденички нет - число положительное

    ;Если мы здесь, значит число отрицательное =(

    mov bx, ax

    mov ax, 65535

    sub ax, bx

    add ax, 1

    ;Теперь в AX хранится модуль числа

    mov bx, 1 ;Ставим флаг, что есть минус

    plus:

    ;Теперь в AX модуль числа. Переводим его в ASCII строку:

    c20:

    cmp ax,0010

    jb c30

    xor dx,dx

    div cx

    or dl,30h

    mov [si],dl

    dec si

    jmp c20
    c30:

    or al,30h

    mov [si],al

    ;Проверим нужно ли поставить знак "-"

    cmp bx, 1

    je addminus ;Знак минус ставить нужно

    ret

    addminus:

    dec si

    mov al, zminus

    mov [si], al

    ret

    FromNumber endp

    ;=============================================

    code ends
    data segment

    new_line db 0dh,0ah,'$'

    msg db 'Result: $'

    msg1 db 'Input a: $'

    msg2 db 'Input b: $'

    otvet db ' $'

    zminus db '-'

    a1 dw ?

    a2 dw ?

    param label byte

    maxlen db 20

    actlen db ?

    field db 20 dup(' ')

    data ends

    stk segment

    db 256 dup (?)

    stk ends

    end begin
    Таблица результатов




    a


    b

    Результат


    UW

    100


    80

    Ответ: 1

    ACM: 1

    100

    100

    Ответ: 23

    ACM: 23

    80

    100

    Ответ: 1250

    ACM: 1250


    Вывод

    Тот факт, что результаты программы на ассемблере совпадают с результатами ручных вычислений, свидетельствует о том, что программа составлена правильно.


    написать администратору сайта