Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаба2(спо).docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
58 Кб
Скачать

Модуль вычисления арифметического выражения на языке Ассемблера Исходный модуль на ассемблере

; Файл lab2_met.asm

title lab2_met

.386

.MODEL flat, Pascal

locals @@

.DATA

ll_w dw 0 ; вспомогательная переменная

;===============================================================================

.CODE

;Внешние переменные

Extrn nn:byte ; вх.данные: количество элементов в массиве

Extrn kk:byte

Extrn arr:byte ; вх.данные: указатель на начало массива (на первый элемент массива)

Extrn Rez_asm:DWord ; вых.данные: : произведение положительных элементов

;Внешняя ссылка

Public DoCalculation

;вспомогательная переменная для работы с массивом -

;указатель на текущий элемент массива

arr_i equ arr[ebx]

DoCalculation proc

;Начальные значения

xor ebx,ebx ; bx:=0 - указатель элемента массива

xor eax, eax

movzx ecx, kk

@@NextElement:

movsx di, byte ptr arr_i

cmp di, 0

jg @@Skip ;если текущий элемент больше 0, то переходим к следующей итерации

add ax, di

@@Skip:

inc ebx

loop @@NextElement

cwde

mov Rez_asm, eax

DoCalculation endp

END

Листинг

Turbo Assembler Version 5.0 01-10-09 15:06:05 Page 1

D:\TASM\BIN\lab2\lab2_met.asm

1 ; Файл lab2_met.asm

2 ;-------------------------------------------------------------------------------

3 ;Программа вычисления произведения ll последних

4 ;положительных элементов массива arr размерности nn.

5 ;-------------------------------------------------------------------------------

6 .386

7 00000000 .MODEL flat, Pascal

8 locals @@

9 00000000 .DATA

10 00000000 0000 ll_w dw 0 ; вспомогательная переменная

11 ;===============================================================================

12 00000002 .CODE

13 ;Внешние переменные

14 Extrn nn:byte ; вх.данные: количество элементов в массиве

15 Extrn ll:byte ; вх.данные: количество последних положительных элементов в массиве

16 Extrn arr:byte ; вх.данные: указатель на начало массива (на первый элемент массива)

17 Extrn exists:byte ; вых.данные: : наличие положительных элементов в массиве

18 Extrn Mul_Rez:Word ; вых.данные: : произведение положительных элементов

19 Extrn Error:byte ; вых.данные: : наличие ошибки переполнения при умножении

20 ;Внешняя ссылка

21 Public DoCalculation

22 ;вспомогательная переменная для работы с массивом -

23 ;указатель на текущий элемент массива

24 = arr[ebx] arr_i equ arr[ebx]

25 00000000 DoCalculation proc

26 ;Начальные значения

27 00000000 C6 05 00000000e 00 mov exists, 0 ; нет положительных элементов

28 00000007 66| C7 05 00000000e + mov Mul_Rez, 1 ; Mul_Rez:=1

29 0001

30 00000010 C6 05 00000000e 00 mov error,0 ; нет ошибки

31 00000017 66| 33 F6 xor si,si ; si:=0 - счетчик положительных чисел

32 0000001A 33 DB xor ebx,ebx ; bx:=0 - указатель элемента массива

33 0000001C 66| 0F B6 05 + movzx ax, ll

34 00000000e

35 00000024 66| A3 00000000r mov ll_w, ax

36 ;Получение в bx указателя последнего элемента массива

37 0000002A 66| 0F B6 3D + movzx di,nn

38 00000000e

39 00000032 66| 4F dec di ; di:=di-1;

40 00000034 66| 8B CF mov cx, di ; начальное значение счетчика циклов

41 00000037 67| E3 44 jcxz @@Exit ; выход, если счетчик равен нулю

42 0000003A @@GetLastBx:

43 0000003A 43 inc ebx ; перемещение указателя на 1 байт

44 0000003B E2 FD loop @@GetLastBx

45 ;Получение результата

46 0000003D 66| 0F B6 0D + movzx cx, nn

47 00000000e

48 00000045 @@GetRez:

49 00000045 66| 0F BE BB + movsx di,byte ptr arr_i ; di:=arr_i=arr[ebx] - текущий элемент массива

50 00000000e

51 0000004D 66| 83 FF 00 cmp di,0 ; сравнение с нулем

52 00000051 7E 28 90 90 90 90 jle @@Continue ; if arr[ebx] <= 0

53 ; if arr[bx] > 0

54 00000057 66| 46 inc si ; si:=si+1 - количество положительных чисел

55 00000059 66| A1 00000000e mov ax,Mul_Rez ; ax:=Mul_Rez - текущее значение произведения

56 0000005F 66| F7 E7 mul di ; <dx:ax>:=<ax>*Mul_Rez

57 00000062 72 32 90 90 90 90 jc @@error ; ошибка переполнения

Turbo Assembler Version 5.0 01-10-09 15:06:05 Page 2

D:\TASM\BIN\lab2\lab2_met.asm

lab2_met

58 00000068 66| A3 00000000e mov Mul_Rez,ax ; <ax>:=<ax>*Mul_Rez

59 0000006E 66| 3B 35 00000000r cmp si, ll_w ;проверка условия завершения цикла

60 00000075 74 07 90 90 90 90 je @@exit ; if si = ll_w

61 ; переход к предыдущему элементу массива

62 0000007B @@Continue:

63 0000007B 4B dec ebx

64 0000007C E2 C7 loop @@GetRez

65 ; Выход

66 0000007E @@Exit:

67 ; наличие положительных элементов

68 0000007E 66| 83 FE 00 cmp si, 0

69 00000082 7F 0A 90 90 90 90 jg @@exists

70 00000088 7E 0B 90 90 90 90 jle @@noexists

71 0000008E @@exists:

72 0000008E C6 05 00000000e 01 mov exists,1 ; есть положительные элементы

73 00000095 @@noexists:

1 74 00000095 C3 RET 00000h

75 ; Ошибка переполнения

76 00000096 @@error:

77 00000096 C6 05 00000000e 01 mov error, 1 ; ошибка переполнения

78 0000009D EB DF jmp @@Exit

79 0000009F DoCalculation endp

80

81 END

Turbo Assembler Version 5.0 01-10-09 15:06:05 Page 3

Symbol Table

lab2_met

Symbol Name Type Value

??DATE Text "01-10-09"

??FILENAME Text "lab2_met"

??TIME Text "15:06:05"

??VERSION Number 0500

@32BIT Text 1

@@CONTINUE Near32 FLAT:007B

@@ERROR Near32 FLAT:0096

@@EXISTS Near32 FLAT:008E

@@EXIT Near32 FLAT:007E

@@GETLASTBX Near32 FLAT:003A

@@GETREZ Near32 FLAT:0045

@@NOEXISTS Near32 FLAT:0095

@CODE Text FLAT

@CODESIZE Text 0

@CPU Text 0F0FH

@CURSEG Text _TEXT

@DATA Text FLAT

@DATASIZE Text 0

@FILENAME Text LAB2_MET

@INTERFACE Text 004H

@MODEL Text 1

@STACK Text FLAT

@WORDSIZE Text 4

ARR Byte FLAT:---- Extern

ARR_I Text arr[ebx]

DOCALCULATION Near32 FLAT:0000

ERROR Byte FLAT:---- Extern

EXISTS Byte FLAT:---- Extern

LL Byte FLAT:---- Extern

LL_W Word FLAT:0000

MUL_REZ Word FLAT:---- Extern

NN Byte FLAT:---- Extern

Groups & Segments Bit Size Align Combine Class

DGROUP Group

_DATA 32 0002 Dword Public DATA

FLAT Group

_TEXT 32 009F Dword Public CODE