logo search
TurboProlog / Документация / TOM_2

Программирование на низком уровне.

Наилучшим методом программирования на низком уровне является исполь-

зование внутреннего ассемблера Турбо Си. Это означает, что Турбо Си берет

на себя передачу параметров, сохранение ВР и объявление сегментов.) Для

детального знакомства с внутренним ассемблером см. "Руководство пользова-

теля Турбо Си".)

В этом примере использования внутреннего ассемблера мы устанавливаем

функцию date, которая является частью системы Турбо Пролог. Этот пример

даст вам некоторые идеи относительно программирования аналогичных задач.

/*Программа CH22EXO9.PRO*/

project "dateproj"

global predicates

mydate(integer,integer,integer) - (i,i,i)(o,o,o)

language asm

goal

mydate(Y,M,D),

write("\nYear=", Y, ", Month=", M, ", Day=", D),

mydate(1988, 3, 3),

mydate(Y1, M1, D1),

write("\nYear=", Y1, ", Month=", M1, ", Day=", D1).

Если перед процедурой Турбо Си использована директива pascal, то

Турбо Си создаст ту же запись активизации, что и Турбо Пролог для опции

asm. Программа Турбо Си выглядит следующим образом:

/*Программа CH22EXO10.C*/:

pascal mydate_0(int Year, int Month, int Day)

{

asm mov cx,Year

asm mov cx,Month

asm mov cx,Day

asm mov ah,02BH

asm int 21H /*Set the new date*/

}

pascal mydate_1(int *Year, int *Month, int *Day)

{

asm mov ah,2AH

asm int 21H

/*Now the date is placed in the registers: CX=Year, DH=Month,

DL=Day*/

asm les di,Year

asm mov es:[di],cx

asm les di,Month

asm mov es:[di],dh

asm mov es:1[di],byte ptr 0

asm les di,Day

asm mov es:[di],dl

asm mov es:1[di],byte ptr 0

}

Файл определения проекта для автоматической компоновки должен выгля-

деть так:

prodate

cdate

Если вы задаете опцию -S компилятора Турбо Си (используя ТСС, версию

командной строки компилятора Турбо Си), то компилятор создаст ассемблер-

ный листинг получившейся программы:

name CH22EXO10

CH22EXO10_TEXT segment byte public 'CODE'

DGROUP group _DATA,_BSS

assume cs:CH22EXO10_TEXT,ds:DGROUP

CH22EXO10_TEXT ends

_DATA 'segment word public 'DATA'

d& label byte

_DATA ends

_BSS segment word public 'BSS'

b& label byte

_BSS ends

CH22EXO10_TEXT segment byte public 'CODE'

; Line 3

MYDATE_0 prog far

push bp

mov bp,sp

; Line 4

mov cx ,[bp+10]

; Line 5

mov dh ,[bp+8]

; Line 6

mov dl ,[bp+6]

; Line 7

mov ah ,02BH

; Line 8

int 21H

@1:

pop bp

ret 6

MYDATE_0 endp

; Line 11

MYDATE_1 prog far

push si

push di

push bp

mov bp,sp

; Line 12

mov ah ,2AH

; Line 13

int 21H

; Line 14

; Line 15

les di ,[bp+18]

; Line 16

mov es :[di ],cx

; Line 17

les di ,[bp+14]

; Line 18

mov es :[di ],dh

; Line 19

mov es :1[di ],byte ptr 0

; Line 20

les di ,[bp+10]

; Line 21

mov es :[di ],d1

; Line 22

mov es :1[di ],byte ptr 0

@2:

pop bp

pop di

pop si

ret 12

MYDATE_1 endp

CH22EXO10_TEXT ends

_DATA segment word public 'DATA'

s& label byte

_DATA ends

CH22EXO10_TEXT segment byte public 'CODE'

public MYDATE_1

public MYDATE_0

CH22EXO10_TEXT ends

end