Подпрограмма ввода и вывода целых чисел на Ассемблере IBM

На языке Си для int, float

Программа на языке программирования Си для int

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

const int N = 4;

void raschet(int a, int c, int d[])

{int g, k, l, z;

int Y = 0;

g = 2 * c;

k = a*a + 1;

cout << "g = " << "2 * " << c << " = " << g << endl;

cout << "k = " << a*a << " + 1" << " = " << k << endl;

for (int i = 1; i <= N; i++)

{l = d[i] / 4;

cout << i << ") " << "l[" << d[i] << "] = " << d[i] << " / 4 = " << l << endl;

z = (g - l) / k;

cout << " z[" << d[i] << "] = " << z << endl;

Y = Y + z;

cout << endl;}

cout << "Y = " << Y << endl;}

int main()

{setlocale(LC_ALL, "Russian");

int a, c, d[N];

cout << "Введите a = ";

cin >> a;

cout << "Введите с = ";

cin >> c;

cout << "Введите элементы массива" << endl;

for (int i = 1; i <= N; i++)

{cout << "d[" << i << "] = ";

cin >> d[i];}

raschet(a, c, d);

_getch();

return 0;}

Программа на языке программирования Си для float

#include "stdafx.h"

#include <iostream>

#include <conio.h>

using namespace std;

const int N = 4;

void raschet(float a, float c, float d[])

{float g, k, l, z;

float Y = 0;

g = 2 * c;

k = a*a + 1;

cout << "g = " << "2 * " << c << " = " << g << endl;

cout << "k = " << a*a << " + 1" << " = " << k << endl;

for (int i = 1; i <= N; i++)

{l = d[i] / 4;

cout << i << ") " << "l[" << d[i] << "] = " << d[i] << " / 4 = " << l << endl;

z = (g - l) / k;

cout << " z[" << d[i] << "] = " << z << endl;

Y = Y + z;

cout << endl;}

cout << "Y = " << Y << endl;}

 

 

ВЛГУ. 230100.7.1.00 ПЗ


int main()

{setlocale(LC_ALL, "Russian");

float a, c, d[N];

cout << "Введите a = ";

cin >> a;

cout << "Введите с = ";

cin >> c;

cout << "Введите элементы массива" << endl;

for (int i = 1; i <= N; i++)

{cout << "d[" << i << "] = ";

cin >> d[i];}

raschet(a, c, d);

_getch();

return 0;}

Блок схема

нет
z=(2*c-d[i]/4)/(a*a-1) y=y+z
да
i<5
i=0, y=0
Ввод a, c, d[i]

 

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист

 


 

 

Вывод y

 


 

ВЛГУ. 230100.7.1.00 ПЗ


3. Программирование

Изм.
Лист
№ докум.
Подпись
Дата
Лист

Программа на Ассемблере УМ

Ex77 start 0

lda c

mul c2

sta p

ldx c0

lda c0

usl comp c12

jgt art

jeq art

jsub inc

rmo x,a ;i:=i+1

add c3

rmo a,x

j usl

art lda y

hlt

c word 20

e word 2

c0 word 0

c1 word 1

c3 word 3

c4 word 4

c12 word 12

c2 word 2

y word 0

d word 20

word 12

word 4

word -16

o resb 3

k resb 3

p resb 3

inc lda e

mul e

add c1

sta k

lda d,x

div c4

sta o

lda p

sub o

div k

add y

sta y

rsub

end Ex77

 

ВЛГУ. 230100.7.1.00 ПЗ


Блок схема

 

inc

 

Изм.
Лист
№ докум.
Подпись
Дата
Лист

 

ВЛГУ. 230100.7.1.00 ПЗ


Подпрограмма ввода и вывода целых чисел на Ассемблере IBM

Подпрограмма ввода

Блок схема

Изм.
Лист
№ докум.
Подпись
Дата
Лист

 

ВЛГУ. 230100.7.1.00 ПЗ


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

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 ; повторяем

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

 

 

ВЛГУ. 230100.7.1.00 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист

 


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

 

Процедура вывода

Изм.
Лист
№ докум.
Подпись
Дата
Лист

OutInt proc near ;=====Процедура вывода

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

jns oi1

mov cx, ax ; eсли оно отрицательное, выведем минус и

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

mov ah, 02h

mov dl, '-'

int 21h

mov ax, cx

neg ax

oi1: xor cx, cx ; количество цифр будем держать в CX

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

oi2: xor dx, dx

div bx ; делим число на основание сс, в остатке

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

push dx ; сразу выводить её нельзя, поэтому сохраним

; её в стэке

inc cx

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

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

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

;значит, что дальше

jnz oi2 ; слева только нули

 

;========Вывод=========

mov ah, 02h

oi3: pop dx

add dl, '0' ; извлекаем очередную цифру, переводим её в

; символ и выводим

int 21h

loop oi3 ; повторим ровно столько раз, сколько цифр

; насчитали

ret

OutInt endp

 

 

ВЛГУ. 230100.7.1.00 ПЗ


блок схема

ВЛГУ. 230100.7.1.00 ПЗ
Изм.
Лист
№ докум.
Подпись
Дата
Лист