Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC.doc
Скачиваний:
48
Добавлен:
25.05.2014
Размер:
3.21 Mб
Скачать

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);

Через стек передаются следующие величины: указатель блока вызывающей

программы, указатель на сегмент возврата, смещение возврата и адреса двух

передаваемых параметров. Ниже показаны смещения для каждого элемента в

стеке: