- •Оглавление
- •Введение
- •1.Системный анализ
- •2.Структурное программирование. Схема алгоритма. Программа на языке Си для int, float
- •3. Программирование
- •3.1 Программа на Ассемблере ум
- •3.2 Подпрограмма ввода и вывода целых чисел на Ассемблере ibm
- •3.3 Программа на языке программирования Ассемблер ibm pc
- •4.Тестирование и отладка
- •5. Инструкция пользователя
- •6. Параметры программы
- •Заключение
- •Список использованной литературы
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 ПЗ