Название: Программирование на языках СИ и Ассемблер - Методические указания (Н.В. Городник)

Жанр: Информатика

Просмотров: 1303


2. краткие теоретические сведения

 

Для подпрограмм, предназначенных для вызова из Си-программ, необходимо выполнять соглашения о характеристиках сегментов, модели памяти, правилах передачи параметров и использовании регистров.

Оформленная таким образом ассемблерная подпрограмма имеет вид

.MODEL SMALL,С

func PROC NEAR USES SI DI, a:WORD, b:WORD

    LOCAL X:WORD, y:WORD

; текст подпрограммы

RET

func ENDP

Ассемблерной функции func соответствует следующий прототип в Си-программе:

 

int func(int a, int b);

 

В тексте программы в качестве операндов можно использовать имена локальных переменных и передаваемых параметров. По команде RET автоматически генерируются команды восстановления регистров SI, DI, ВР, SP и затем выполняется возврат содержимого регистра AX в вызывающую программу.

В ассемблерной процедуре можно свободно использовать регистры AX, BX, CX, DX. Остальные регистры должны быть сохранены и восстановлены.

Для обработки строковых данных ассемблер имеет пять команд обработки строк: MOVS – переслать один байт или одно слово из одной области памяти в другую; LODS – загрузить из памяти один байт в регистр AL или одно слово в регистр AX; STOS – записать содержимое регистра AL или AX в память; CMPS – сравнить содержимое двух областей памяти, размером в один байт или одно слово; SCAS – сравнить содержимое регистра AL или AX с содержимым памяти. Префикс REP позволяет этим командам обрабатывать строки любой длины.

Флаг направления DF = 0 (устанавливается командой CLD) задает направление слева направо, а DF = 1 (устанавливается командой STD) – справа налево.

В следующем примере выполняется пересылка 20 байт из STRING1 в STRING2:

 

STRING1 DB 20 DUP('*')

STRING2 DB 20 DUP(")

CLD                                                        ;Сброс флага DF

MOV СХ, 20                                          ;Счетчик на 20 байт

LEA DL, STRING2                               ; Адрес области "куда"

LEA SI, STRING1                                 ;Адрес области "откуда"

REP MOVSB                                         ;Переслать данные

 

Таблица  1

Передача строк в функцию

Передача целых

значений

Действия над

строками

Формирование целого результата

Возврат целого

результата

1

1

1

1

1

1

2

2

1

2

1

1

3

1

2

3

1

1

4

2

2

4

1

1

5

1

1

5

2

1

6

2

1

6

2

1

 

Окончание табл. 1

 

Передача строк в функцию

Передача целых

значений

Действия над

строками

Формирование целого результата

Возврат целого результата

7

1

2

7

2

1

8

2

2

8

2

1

9

1

1

9

1

2

10

2

1

1

1

2

11

1

2

2

1

2

12

2

2

3

1

2

13

1

1

4

2

2

14

2

1

5

2

2

15

1

2

6

2

2

16

2

2

7

2

2

17

1

1

8

1

1

18

2

1

9

1

1

19

1

2

1

1

1

20

2

2

2

1

1

21

1

1

3

2

1

22

2

1

4

2

1

23

1

2

5

2

1

24

2

2

6

2

1

25

1

1

7

1

2

 

Таблица 2

Передача строк в функцию

Передача целых

значений

Действия над

строками

Формирова-ние целого результата

Возврат целого

результата

1

2

1

8

1

2

2

1

2

9

1

2

3

2

2

1

1

2

4

1

1

2

2

2

5

2

1

3

2

2

6

1

2

4

2

2

7

2

2

5

2

2

8

1

1

6

1

1

9

2

1

7

1

1

 

Окончание табл. 2

 

Передача строк в функцию

Передача целых

значений

Действия над

строками

Формирование целого

результата

Возврат целого

результата

10

1

2

8

1

1

11

2

2

9

1

1

12

1

1

1

2

1

13

2

1

2

2

1

14

1

2

3

2

1

15

2