Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные работы ВССТ 2012.docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
699.92 Кб
Скачать

Типовая структура .Asm-программы

1. Имя программы:

TITLE prog.ASM

; может быть комментарий назначения программы

2. Инициализация стековой памяти в сегменте стека:

STACKSEG segment stack

DW N dup(?)

; меньше N=32 слов в стеке обычно

; задавать не следует

STACKSEG ends

3. Инициализация всех переменных в сегменте данных:

DATASEG segment

;задаются имена всех констант и переменных,

; их начальные значения и резервируется

; память под них

DATASEG ends

4. Назначения сегментных регистров в сегменте кодов:

CODESEG segment

assume CS:codeseg, DS:dataseg, SS:stackseg

5. Организация главной программной процедуры far

MAIN proc far

6. Запись адреса префикса программного сегмента (PSP) в стек:

push DS

sub AX, AX

push AX

7. Инициализация содержимого регистра сегмента данных:

mov AX, dataseg

mov DS, AX

;при указании в команде в качестве операнда символического

;имени сегмента (dataseg) происходит пересылка начального

;адреса этого сегмента - неверно указывать offset dataseg

8. Текст программы пользователя в сегменте кодов:

;основной текст программы

9. Восстановление адреса PSP в DS:

ret

10. Тексты используемых процедур

;если имеются процедуры near , используемые в данной программе (например, процедуры str2bin или bin2str), то записываются тексты этих процедур.

11. Закрытие главной процедуры main, сегмента кодов и конец программы:

MAIN endp

CODESEG ends

end MAIN

Итак, обобщенная структура программы:

title prog.asm

stackseg segment

;задание поля памяти для стека

stackseg ends

dataseg segment

;задание полей памяти для данных и

;определение всех констант и переменных

dataseg ends

codeseg segment

assume CS:codeseg, DS:dataseg, SS:stackseg

main proc far

push DX

sub AX, AX

push AX

mov AX, dataseg

mov DS, AX

;основной текст программы

ret

;тексты ближних процедур

main endp

codeseg ends

end main

Пример программы Задача расчета сложных процентов.

Капитал Q вкладывается в некоторое мероприятие, обеспечивающее ежегодный прирост капитала D%. Определить текущую величину капитала в течение первых N лет.

.ASM-программа для создания исполняемой .EXE-программы.

title Raschet.asm

;расчет сложных процентов

stacksg segment stack 'stack'

dw 64 dup(?)

stacksg ends

datasg segment 'data'

; задание переменных

VVQ db 'Введите величину начального капитала (до 64000)'

db 10,13,'$'

VVD db 10,13,'Введите процент годового прироста'

db 10,13,'$'

VVN db 10,13,'Введите количество расчетных лет'

db 10,13,'$'

Q0 dw ?

D dw ?

D1 dw ?

N dw ?

I dw 1

Q dw ?

buf db 5,0,0,0,0,0,0,0

viv1 db ' год капитал'

db 10,13,'$'

srb db 14 dup(0),'$'

sr db 6 dup(0),'$'

srk db 10,13,'$'

ft10 dw 1

ten dw 10

sto dw 100

datasg ends

codesg segment 'code'

main proc far

assume CS:codesg, DS:datasg, SS:stacksg

push DS

sub AX,AX

push AX

mov AX,datasg

mov DS,AX

mov AH,9 ; запрос на ввод Q

mov DX,offset VVQ

int 21H

mov AH,0AH ; ввод Q

mov DX,offset buf

int 21H

call str2bin

mov Q0,DI

mov AH,9 ; запрос на ввод D

mov DX,offset VVD

int 21H

mov AH,0AH ; ввод D

mov DX, offset buf

int 21H

call str2bin

mov D,DI

mov AH,9 ; запрос на ввод N

mov DX,offset VVN

int 21H

mov AH,0AH ; ввод N

mov DX,offset buf

int 21H

call str2bin

mov N, DI

mov AX,D

mov D1,AX

add D1,100 ; расчет D1=(1+D/100)*100

mov AX, Q0 ; присвоение Q=Q0

mov Q, AX

mov ah,9

mov dx,offset viv1

int 21H

rst: mov AX, Q ; расчет Q=Q*D1

mul D1

div sto

mov Q, AX

mov AX,I

call bin2str

mov AH,9 ;вывод года

mov DX,offset sr

int 21H

mov AH,9 ;вывод пробела

mov DX,offset srb

int 21H

mov AX,Q ;вывод прибыли

call bin2str

mov AH,9

mov DX,offset sr

int 21H

mov AH,9 ;перевод строки

mov DX,offset srk

int 21H

inc I ; I=I+1

mov AX, I ; сравнение I с N

cmp AX, N

jle rst ; условный переход по I<=N

ret

bin2str proc near

mov si,offset sr+5

; процедура перевода двоичного

pr2: sub dx,dx

;кода в код ASCII с предварительным

mov [si],dl ;обнулением поля sr -

dec si

cmp si,offset sr

ja pr2

mov cx,10

mov si,offset sr+5

pr1: xor dx,dx

div cx

or dl,30h

mov [si],dl

dec si

cmp ax,0

jne pr1

ret

bin2str endp

str2bin proc near

; процедура перевода ASCII

mov ft10,1 ; -кодов в двоичный код

xor DI,DI

mov cx,10

lea si,buf+1

xor bh,bh

mov bl,[buf+1]

pr3: mov al,[si+bx]

and ax,0fh

mul ft10

add DI,ax

mov AX,ft10

mul ten

mov ft10,AX

dec bx

jnz pr3

ret

str2bin endp

main endp

codesg ends

end main

Примечание. В качестве иллюстративного примера для сравнения сложности программ на языке ассемблера с программами на языке высокого уровня, ниже приводится без пояснений программа решения этой задачи на языке Бейсик:

10 print "Расчет сложных процентов"

20 input "Введите Q, D, N", Q, D, N

30 D1=1+D/100

40 I=1

50 Q=Q*D1

60 print I, Q

70 I=I+1

80 if I<=N then 50

90 end