- •Глава 1 Введение в семейство персональных компьютеров ibm pc
- •Глава 2 Выполнение программ
- •Глава 3 Требования языка ассемблер
- •Глава 4 Ассемблирование и выполнение программ
- •Глава 5 Определение данных
- •Глава 8 Экранные операции I: Основные свойства
- •Глава 9 Экранные операции II: Расширенные возможности
- •Глава 10 Экранные операции III: Цвет и графика
- •Глава 11 Команды обработки строк
- •Глава 12 Арифметические операции I: Обработка двоичных данных
- •Глава 13 Арифметические операции II:
- •Глава 14 Обработка таблиц
- •Глава 15 Дисковая память I: Организация
- •Глава 16 Дисковая память II: Функции базовой версии dos
- •Глава 17 Дисковая память III: Расширенные функции dos
- •Глава 18 Дисковая память IV: Функции bios
- •Глава 19 Печать
- •Глава 20 Макросредства
- •0000 Csig segment para 'Code'
- •0100 Eb 00 begin: jmp short main
- •0102 Main proc near
- •0109 Main endp
- •0109 Cseg ends
- •20.1. Напишите необходимые директивы: а) для подавления всех команд,
- •04Af в регистр cs. Комбинация этих адресов указывает на первую выполняемую
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para 'Code'
- •13D40 плюс 0000. Обратите внимание, что основная программа начинается по
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para public 'code'
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para public 'code'
- •Ibm Personal Computer Linker
- •0000 Stacksg segment para stack 'Stack'
- •0000 Codesg segment para public 'Code'
- •1. Инициализирующая команда push ds заносит адрес сегмента в стек. Этот
- •010 Clear ,32768!
- •1. Наберите ассемблерную подпрограмму, сохраните ее под именем
- •Ibm Personal Computer Linker
- •Version 2.30 (c) Copyright ibm Corp. 1981, 1985
- •00000H 00011h 00012h codesg code
- •Ibm Personal Computer Basic
- •00 Указатель блока вызывающей программы
0000 Stacksg segment para stack 'Stack'
0000 40 [ ???? ] DW 64 DUP(?)
0080 STACKSG ENDS
;-------------------------------------------------
0000 DATASG SEGMENT PARA 'Data'
0000 0140 QTY DW 0140H
0002 2500 PRICE DW 2500H
0004 DATASG ENDS
;-------------------------------------------------
0000 CODESG SEGMENT PARA PUBLIC 'Code'
0000 BEGIN PROC FAR
ASSUME CS:CODESG,DS:DATASG,SS:STACKSG
0000 1E PUSH DS
0001 2B C0 SUB AX,AX
0003 50 PUSH AX
0004 B8 ---- R MOV A,DATASG
0007 8E D8 MOV DS,AX
0009 FF 36 0002 R PUSH PRICE
000D FF 36 0000 R PUSH QTY
0011 9A 0000 ---- E CALL SUBMUL ;Вызвать подпрограмму
0016 CB RET
0017 BEGIN ENDP
0017 CODESG ENDS
END BEGIN
_____________________________________________________________________
Segments and Groups:
N a m e Sise Align Combine Class
CODESG . . . . . . . . . . . . 0017 PARA NONE 'CODE'
DATASG . . . . . . . . . . . . 0004 PARA NONE 'DATA'
STACKSG. . . . . . . . . . . . 0080 PARA STACK 'STACK'
Symbols:
N a m e Type Value Attr
BEGIN. . . . . . . . . . . . . F PROC 0000 CODESG Length=0017
PRICE. . . . . . . . . . . . . L WORD 0002 DATASG
QTY. . . . . . . . . . . . . . L WORD 0000 DATASG
SUBMUL . . . . . . . . . . . . L FAR 0000 External
_____________________________________________________________________
page 60,132
TITLE SUBMUL Вызываемая подпрограмма умножения
0000 Codesg segment para public 'Code'
0000 SUBMUL PROC FAR
ASSUME CS:CODESG
PUBLIC SUMBUL
0000 55 PUSH BP
0001 8P EC MOV BP,SP
0003 8B 46 08 MOV AX,[BP+8] ;Стоимость
0006 8B 5E 06 MOV BX,[BP+6] ;Количество
0009 F7 E3 MUL BX ;Произведение в DX:AX
000B 5D POP BP
000F SUMBUL ENDP
000F CODESG ENDS
END
_____________________________________________________________________
Segments and Groups:
N a m e Size Align Combine Class
CODESG . . . . . . . . . . . . 000F PARA PUBLIC 'CODE'
Symbols:
N a m e Type Value Attr
SUBMUL . . . . . . . . . . . . F PROC 0000 CODESG Global Length=000F
_____________________________________________________________________
LINK
IBM Personal Computer Linker
Version 2.30 (C) Copyright IBM Corp 1981, 1985
Object Modules: B:CALLMUL4+B:SUBMUL4
Run File: [B:CALLMUL4.EXE]:
List File: [NUL.MAP]: CON
Libraries [.LIB]:
Start Stop Length Name Class
00000H 00019H 001AH CODESG CODE
00030H 00033H 0004H DATASG DATA
00040H 000BFH 0080H STACKSG STACK
PROGRAM entry point at 0000:0000
__________________________________________________________________________
Рис.21.6. Передача параметров.
Другим способом обеспечения доступа к данным из вызываемой
подпрограммы является передача параметров. В этом случае вызывающая
программа физически передает данные через стек. Каждая команда PUSH должна
записывать в стек данные размером в одно слово из памяти или из регистра.
Программа, приведенная на рис.21.6, прежде чем вызвать подпрограмму
SUBMUL заносит в стек значения из полей PRICE и QTY. После команды CALL
стек выглядит следующим образом:
... | 1600 | D213 | 4001 | 0025 | 0000 | C213 |
6 5 4 3 2 1