- •Вариант №2
- •Приложение в среде Borland Delphi 7 для ввода исходных данных и получения результатов расчета. Главное окно приложения
- •Листинг модуля главной формы приложения
- •Модуль вычисления арифметического выражения на языке Ассемблера Исходный модуль на ассемблере
- •Листинг
- •Тестирование вычисления арифметического выражения для различных вариантов исходных данных
Модуль вычисления арифметического выражения на языке Ассемблера Исходный модуль на ассемблере
; Файл 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
