- •Глава 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 Указатель блока вызывающей программы
Ibm Personal Computer Linker
Version 2.30 (c) Copyright ibm Corp. 1981, 1985
Object Modules [.OBJ]: LINKBAS
Run File [LINKBAS.EXE]: LINKBAS/HIGH
List File [NUL.MAP]: CON
Libraries [.LIB]:
Warning: no stack segment
Start Stop Length Name Class
00000H 00011h 00012h codesg code
D>DEBUG BASIC.COM
-R
AX=0000 BX=0000 CX=0012 DX=0000 SP=FFFF BP=0000 SI=0000 DI=0000
DS=1410 ES=1410 SS=1410 CS=1410 IP=0100 NV UP EI PL NZ NA PO NC
1410:0100 E9E03E JMP 3FE3
-N D:LINKBAS.EXE
-L
-R
AX=FFA3 BX=0000 CX=0012 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000
DS=1410 ES=1410 SS=9FE0 CS=9FE0 IP=0000 NV UP EI PL NZ NA PO NC
9FE0:0000 55
-R SS
SS 9FE0
:1410
-R CS
CS 9FE0
:1410
-R IP
IP 0000
:0100
-G
Ok
DEF SEG = &H9EF0
Ok
BSAVE "D:CLRSCREEN.MOD",0,&H12
Ok
SYSTEM
Program terminated normally
-Q
D>BASIC
Ibm Personal Computer Basic
Ver4sion D3.10 Copyright IBM Corp. 1981, 1985
61310 Bytes free
Ok
LOAD"D:BASTEST.BAS
Ok
20 BLOAD "D:CLRSCREEN.MOD"
30 DEF SEG = &H9FE0
40 CLRSCRN = 0
50 CALL CLRSCRN
LIST
10 CLEAR ,32768!
20 BLOAD "D:CLRSCRN.MOD"
30 DEF SEG = &H9FE0
40 CLRSCRN = 0
50 CALL CLRSCRN
60 FOR N = 1 TO 5
70 INPUT "HOURS"; H
80 INPUT "rATE"; R
90 W = H * R
100 PRINT "WAGE = " W
110 NEXT N
120 END
Ok
__________________________________________________________________________
Рис.21.8. Этапы связи BASIC и ассемблера.
КОМПОНОВКА ПРОГРАММ НА ЯЗЫКЕ PASCAL И АССЕМБЛЕРЕ
________________________________________________________________
__________________________________________________________________________
program pascall ( input, output );
procedure move_cursor( const row: integer;
const col: integer ); extern;
var
temp_row: integer;
temp_col: integer;
begin
write( 'Enter cursor row: ' );
readln( temp_row );
write( 'Enter cursor column:' );
readln( temp_col );
move_cursor( temprow, temp_col );
write( 'New cursor location' );
end.
_____________________________________________________________________
TITLE MOVCUR Подпрограмма на ассемблере,
; вызываемая из программы на Паскале
PUBLIC MOVE_CURSOR
;----------------------------------------------------------
; MOVE_CURSOR: Устанавливает курсор
; по переданным параметрам
; Параметры: const row Строка и столбец
; const col для установки курсора
; Возвращаемое значение: Отсутствует
;----------------------------------------------------------
CODESEG SEGMENT PARA PUBLIC 'CODE'
MOVE_CURSOR PROC FAR
ASSUME CS:CODESEG
ROWWPAR EQU 8 ;Параметр "строка"
COLPAR EQU 6 ;Параметр "столбец"
PUSH BP ;Сохранить регистр BP
MOV BP,SP ;Установить BP на параметры
MOV SI,[BP+ROWPAR] ;SI указывает на строку
MOV DH,[SI] ;Поместить столбец в DL
MOV AH,02 ;Функция установки курсора
SUB BH,BH ;Страница #0
INT 10H
POP BP ;Вернуться
RET 4 ; в вызывающую программу
MOVE_CURSOR ENDP
CODESEG ENDS
END
__________________________________________________________________________
Рис.21.9. Компановка PASCAL-ассемблер.
В данном разделе показано, как можно установить связь между
программами на языке PASCAL фирм IBM и MicroSoft с программами на
ассемблере. На рис.21.9 приведен пример связи простой PASCAL-программы с
ассемблерной подпрограммой. PASCAL-программа скомпилирована для получения
OBJ-модуля, а ассемблерная программа оттранслирована также для получения
OBJ-модуля. Программа LINK затем компонует вместе эти два OBJ-модуля в
один выполнимый EXE-модуль.
В PASCAL-программе определены две переменные: temp_row и temp_col,
которые содержат введенные с клавиатуры значения строки и колонки
соответственно. Программа передает адреса переменных temp_row и temp_col в
виде параметров в ассемблерную подпрограмму для установки курсора по этим
координатам. PASCAL-программа определяет также имя ассемблерной
подпрограммы в операторе procedure как move_cursor и определяет два
параметра, как extern (внешние). Оператор в PASCAL-программе, который
вызывает ассемблерную программу по имени и передает параметры, имеет
следующий вид:
move_cursor (temp_row, temp_col);
Через стек передаются следующие величины: указатель блока вызывающей
программы, указатель на сегмент возврата, смещение возврата и адреса двух
передаваемых параметров. Ниже показаны смещения для каждого элемента в
стеке: