Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой проект.docx
Скачиваний:
16
Добавлен:
21.03.2015
Размер:
1.57 Mб
Скачать

3.3 Программа на языке программирования Ассемблер ibm pc

.modelsmall

.stack200h

.data

a db ?

c db ?

d db 4 dup (?,?,?,?)

e dw ?

f dw ?

y dw ?

t dw 8

D16 db '0123456789ABCDEF'

BUF db 4 DUP (20h),13,10,'$'

str1 db 'Resultat',13,10,'$'

.code

OutInt proc

test ax, ax ; Проверяем число на знак.

jns oi1

; Если оно отрицательное, выведем

;минус и оставим его модуль.

mov cx, ax

mov ah, 02h

mov dl, '-'

int 21h

mov ax, cx

neg ax

; Количество цифр будем держать в CX

oi1:

xor cx, cx

mov bx, 10 ; основание сс. 10 для десятеричной и т.п.

oi2:

xordx,dx

divbx

; Делим число на основание сс.

;В остатке получается последняя цифра.

; Сразу выводить её нельзя,

;поэтому сохраним её в стэке.

push dx

inc cx

; А с частным повторяем то же самое,

;отделяя от него очередную

; цифру справа, пока не останется ноль,

; что значит, что дальше слева только нули.

test ax, ax

jnz oi2

; Теперь приступим к выводу.

ВЛГУ. 230100.7.1.00 ПЗ

movah, 02h

oi3:

popdx

; Извлекаем очередную цифру,

;переводим её в символ и выводим.

add dl, '0'

int 21h

; Повторим ровно столько раз,

;сколько цифр насчитали.

loop oi3

ret

OutInt endp

InputInt proc

mov ah,0ah

xor di,di

mov dx,offset buff ; аддрес буфера

int 21h ; принимаем строку

mov dl,0ah

mov ah,02

int 21h ; выводим перевода строки

; обрабатываем содержимое буфера

mov si,offset buff+2 ; берем аддрес начала строки

cmp byte ptr [si],"-" ; если первый символ минус

jnz ii1

mov di,1 ; устанавливаем флаг

inc si ; и пропускаем его

ii1:

xor ax,ax

mov bx,10 ; основание сc

ii2:

mov cl,[si] ; берем символ из буфера

cmp cl,0dh ; проверяем не последний ли он

jz endin

; если символ не последний, то

;проверяем его на правильность

cmp cl,'0' ; если введен неверный символ <0

jl er

cmp cl,'9' ; если введен неверный символ >9

ja er

sub cl,'0' ; делаем из символа число

mul bx ; умножаем на 10

add ax,cx ; прибавляем к остальным

inc si ; указатель на следующий символ

jmp ii2 ; повторяем

ВЛГУ. 230100.7.1.00 ПЗ

er: ; если была ошибка, то выводим

;сообщение об этом и выходим

mov dx, offset error

mov ah,09

int 21h

int 20h

; все символы из буфера

;обработаны число находится в ax

endin:

cmp di,1 ; если установлен флаг, то

jnz ii3

neg ax ; делаем число отрицательным

ii3:

ret

error db "incorrect number$"

buff db 6,7 Dup(?)

InputInt endp

PP1 proc near ;---------------------e

mov Al,2

mov BL,c

imul BL

cbw

mov e,AX

cwd

mov AX,0

mov BX,0

ret 6 ;???

PP1 endp

PP2 proc near ;f

mov AX,0

mov AL,a

imul AL

cbw

mov DX, 1

add AX, DX

cbw

mov f, AX

cwd

mov AX,0

mov DX,0

ret 6 ;???

PP2 endp

Begin:

mov ax, @Data

mov ds, ax

ВЛГУ. 230100.7.1.00 ПЗ

call InputInt ; ввод числа а

mov a,AL

call InputInt ; ввод числа с

mov c,AL

mov SI,0

push SI

l1: call InputInt

pop SI

mov d[SI], AL

add SI,2

cmp SI,t

push SI

jne l1

call PP1 ;вызов п\п 1

call PP2 ;вызов п\п 2

mov SI,0

mov CX,4

xor AX,AX

mov y,AX

for: mov DX,0

mov AH,0

mov CL,0

mov AL,d[SI]

mov BL, AL

cbw

cmp AX,0

jg m2

mov CL,1

mov AL, BL

neg AL

cbw

m2: mov DL,4

idiv DL

cbw

cmp CL,0

je m3

neg AL

cbw

m3: mov BX, e

sub BX,AX

cbw

mov AX,BX

cwd

mov AX, BX

cwd

mov BX,f

idiv BX ;AL=AL/f

ВЛГУ. 230100.7.1.00 ПЗ

cbw

mov BX,AX

cwd

mov AX, BX

cwd

mov DX,y

add AX, DX

cbw

mov y, AX

add SI,2

cmp SI,t

jne for

mov CX,0

mov AX, y

mov DX, AX ;DX:=AX

call OutInt

mov AX,4c00h

int 21h

END begin

Программа на языке программирования Ассемблер IBM PC

Блок схема

ВЛГУ. 230100.7.1.00 ПЗ

ВЛГУ. 230100.7.1.00 ПЗ