Материал: Larin_Anton_OEVM_21_3

Внимание! Если размещение файла нарушает Ваши авторские права, то обязательно сообщите нам

Выполнение

Вариант 13 Шифр задания 2.8.3

/ - (4*i+3) , при a>b

f2 = <

\ 6*i -10 , при a<=b

/ - (6*i+8) , при a>b

f8 = <

\ 9 -3*(i-1), при a<=b

/ |i1 + i2|, при k=0

f3 = <

\ min(i1,i2), при k/=0

Сегменты в программе размещены в порядке:

  1. Стек

  2. Данные

  3. Код

В сегменте данных заданы метки для переменных a, b, i, k, i1, i2, res использующихся в программе.

В связи с запретом на использование процедур в программе, функции были реализованы при помощи фрагментов кода, размеченных метками, с безусловными переходами на них. “Вызов” функции безусловным переходом jmp к метке данной функции. Функции используют значения переменных в сегменте данных, непосредственной передачи аргументов в функцию не происходит. Возврат значения происходит посредством заталкивания результата в стек, и выталкивание оного в переменную в основном фрагменте программы.

Функции содержат ветвление. Их поведение зависит от состояния переменных a, b, следовательно функции f1 и f2 логически подразделяются на три части:

сравнение переменных a и b и две ветви, переход в которые осуществляется непосредственно после сравнения. После расчета значения функции, оно помещается в стек, а управление передается в основной фрагмент кода, по заранее заданной метке.

Исполнение функции f3 происходит аналогичным образом, но использует значения рассчитанные в двух предыдущих функциях

Тестирование.

a

b

i

k

i1 = f1

i2 = f2

res = f3

1

2

2

0

2

6

8

2

1

2

1

-11

-20

-20

2

1

2

0

-11

-20

31

Выводы.

В результате работы были разобраны некоторые базовые концепции языка ассемблера. Были изучены команды сравнения, условного и безусловного перехода. Была написана рабочая программа, рассчитывающая значения кусочных математических функций.

Приложение

LR3.ASM

STACKSG SEGMENT PARA STACK 'Stack'

DW 32 DUP(?)

STACKSG ENDS

DATASG SEGMENT PARA 'Data' ;SEG DATA

VARA DW 1h

VARB DW 1h

VARI DW 1h

VARK DW 1h

VARI1 DW 1h

VARI2 DW 1h

VARRES DW 1h

DATASG ENDS ;ENDS DATA

CODE SEGMENT ;SEG CODE

ASSUME CS:Code

Main PROC FAR

mov ax, DATASG ;ds setup

mov ds, ax

jmp f1

f1_end:

mov di,offset VARI1

pop [di]

jmp f2

f2_end:

mov di,offset VARI2

pop [di]

jmp f3

f3_end:

mov di,offset VARRES

pop [di]

mov ah, 4ch ;exit

int 21h

f1:

mov si,OFFSET VARA ;si = &a

mov ax,[si] ;ax = *si (a)

mov si,OFFSET VARB ;si = &b

cmp ax,[si] ;cmp ax,*si (a,b)

jg f1_1 ;if a>b

jmp f1_2

f1_1: ;then -(4i+3) = (-4i - 3)

mov si,offset VARI

mov bx,[si] ;bx = i

shl bx,1 ;bx *= 2

shl bx,1 ;bx *= 2

sub ax,ax ;ax = 0

sub ax,bx ;ax = -bx (-4i)

sub ax,3 ;ax -= 3

push ax ;ret ax

jmp f1_c

f1_2: ;else (6i-10)

mov si,offset VARI

mov bx,[si] ;bx = i

shl bx,1 ;bx *= 2

shl bx,1 ;bx *= 2

mov ax,[si] ;ax = i

shl ax,1 ;ax *= 2

add ax,bx ;ax += bx (ax = 6i)

sub ax,10 ;ax -= 10

push ax ;ret ax

jmp f1_c

f1_c:

jmp f1_end

f2:

mov si,OFFSET VARA ;si = &a

mov ax,[si] ;ax = *si (a)

mov si,OFFSET VARB ;si = &b

cmp ax,[si] ;cmp ax,*si (a,b)

jg f2_1 ;if a>b

jmp f2_2

f2_1: ;then -(6i + 8) = (-6i - 8)

mov si,offset VARI

mov bx,[si] ;bx = i

shl bx,1 ;bx *= 2

shl bx,1 ;bx *= 2

mov ax,[si] ;ax = i

shl ax,1 ;ax *= 2

add ax,bx ;ax += bx (ax = 6i)

sub bx,bx ;bx = 0

sub bx,ax ;bx = -ax (bx = -6i)

sub bx,8 ;bx -= 8

push bx ;ret bx

jmp f2_c

f2_2: ;else 9-3(i-1) = -3i + 12

mov si,offset VARI

mov ax,[si] ;ax = i

shl ax,1 ;ax *= 2

add ax,[si] ;ax += i (ax = 3i)

sub bx,bx ;bx = 0

sub bx,ax ;bx = -ax (bx = -3i)

add bx,12 ;bx += 12

push bx ;ret bx

jmp f2_c

f2_c:

jmp f2_end

f3:

mov si,OFFSET VARK ;si = &k

mov ax,[si] ;ax = *si (k)

cmp ax,0 ;cmp k,0

je f3_1 ;if k=0

jmp f3_2

f3_1: ;then abs(i1+i2)

mov si,offset VARI1

mov ax,[si] ;ax = i1

mov si,offset VARI2

add ax,[si] ;ax += i2 (ax = i1 + i2)

cmp ax,0 ;cmp i1+i2,0

jnl f3_1_c ;unless ax >= 0

neg ax ;neg ax

f3_1_c: ;else dont

push ax ;ret ax

jmp f3_c

f3_2: ;else min(i1,i2)

mov si,offset VARI1

mov ax,[si] ;ax = i1

mov si,offset VARI2

cmp ax,[si] ;cmp i1,i2

jg f3_2_c ;unless i1 > i2

push ax ;ret i2

jmp f3_c

f3_2_c: ;else

push [si] ;ret i1

jmp f3_c

f3_c:

jmp f3_end

Main ENDP

CODE ENDS

END Main ;ENDS CODE

LR3.Lst

#Microsoft (R) Macro Assembler Version 5.10 9/25/19 24:04:53

Page 1-1

0000 STACKSG SEGMENT PARA STACK 'Stack'

0000 0020[ DW 32 DUP(?)

????

]

0040 STACKSG ENDS

0000 DATASG SEGMENT PARA 'Data'

;SEG DATA

0000 0001 VARA DW 1h

0002 0001 VARB DW 1h

0004 0001 VARI DW 1h

0006 0001 VARK DW 1h

0008 0001 VARI1 DW 1h

000A 0001 VARI2 DW 1h

000C 0001 VARRES DW 1h

000E DATASG ENDS

;ENDS DATA

0000 CODE SEGMENT

;SEG CODE

ASSUME CS:Code

0000 Main PROC FAR

0000 B8 ---- R mov ax, DATASG

;ds setup

0003 8E D8 mov ds, ax

0005 EB 1A 90 jmp f1

0008 f1_end:

0008 BF 0008 R mov di,offset VARI1

000B 8F 05 pop [di]

000D EB 4D 90 jmp f2

0010 f2_end:

0010 BF 000A R mov di,offset VARI2

0013 8F 05 pop [di]

0015 E9 009C R jmp f3

0018 f3_end:

0018 BF 000C R mov di,offset VARRES

001B 8F 05 pop [di]

001D B4 4C mov ah, 4ch

;exit

001F CD 21 int 21h

0021 f1:

0021 BE 0000 R mov si,OFFSET VARA ;si = &a

0024 8B 04 mov ax,[si] ;ax = *si

#Microsoft (R) Macro Assembler Version 5.10 9/25/19 24:04:53

Page 1-2

(a)

0026 BE 0002 R mov si,OFFSET VARB ;si = &b

0029 3B 04 cmp ax,[si] ;cmp ax,*si

(a,b)

002B 7F 03 jg f1_1 ;if a>b

002D EB 15 90 jmp f1_2

0030 f1_1: ;then -

(4i+3) = (-4i - 3)

0030 BE 0004 R mov si,offset VARI

0033 8B 1C mov bx,[si] ;bx = i

0035 D1 E3 shl bx,1 ;bx *=

2

0037 D1 E3 shl bx,1 ;bx *=

2

0039 2B C0 sub ax,ax ;ax = 0

003B 2B C3 sub ax,bx ;ax = -

bx (-4i)

003D 2D 0003 sub ax,3 ;ax -=

3

0040 50 push ax ;ret ax

0041 EB 17 90 jmp f1_c

0044 f1_2: ;else (

6i-10)

0044 BE 0004 R mov si,offset VARI

0047 8B 1C mov bx,[si] ;bx = i

0049 D1 E3 shl bx,1 ;bx *=

2

004B D1 E3 shl bx,1 ;bx *=

2

004D 8B 04 mov ax,[si] ;ax = i

004F D1 E0 shl ax,1 ;ax *=

2

0051 03 C3 add ax,bx ;ax +=

bx (ax = 6i)

0053 2D 000A sub ax,10 ;ax -=

10

0056 50 push ax ;ret ax

0057 EB 01 90 jmp f1_c

005A f1_c:

005A EB AC jmp f1_end

005C f2:

005C BE 0000 R mov si,OFFSET VARA ;si = &a

005F 8B 04 mov ax,[si] ;ax = *si

(a)

0061 BE 0002 R mov si,OFFSET VARB ;si = &b

0064 3B 04 cmp ax,[si] ;cmp ax,*si

(a,b)

0066 7F 03 jg f2_1 ;if a>b

0068 EB 1B 90 jmp f2_2

006B f2_1: ;then -

(6i + 8) = (-6i - 8)

006B BE 0004 R mov si,offset VARI

#Microsoft (R) Macro Assembler Version 5.10 9/25/19 24:04:53

Page 1-3

006E 8B 1C mov bx,[si] ;bx = i

0070 D1 E3 shl bx,1 ;bx *=

2

0072 D1 E3 shl bx,1 ;bx *=

2

0074 8B 04 mov ax,[si] ;ax = i

0076 D1 E0 shl ax,1 ;ax *=

2

0078 03 C3 add ax,bx ;ax +=

bx (ax = 6i)

007A 2B DB sub bx,bx ;bx = 0

007C 2B D8 sub bx,ax ;bx = -

ax (bx = -6i)

007E 83 EB 08 sub bx,8 ;bx -=

8

0081 53 push bx ;ret bx

0082 EB 15 90 jmp f2_c

0085 f2_2: ;else 9

-3(i-1) = -3i + 12

0085 BE 0004 R mov si,offset VARI

0088 8B 04 mov ax,[si] ;ax = i

008A D1 E0 shl ax,1 ;ax *=

2

008C 03 04 add ax,[si] ;ax +=

i (ax = 3i)

008E 2B DB sub bx,bx ;bx = 0

0090 2B D8 sub bx,ax ;bx = -

ax (bx = -3i)

0092 83 C3 0C add bx,12 ;bx +=

12

0095 53 push bx ;ret bx

0096 EB 01 90 jmp f2_c

0099 f2_c:

0099 E9 0010 R jmp f2_end

009C f3:

009C BE 0006 R mov si,OFFSET VARK ;si = &k

009F 8B 04 mov ax,[si] ;ax = *si

(k)

00A1 3D 0000 cmp ax,0 ;cmp k,0

00A4 74 03 je f3_1 ;if k=0

00A6 EB 16 90 jmp f3_2

00A9 f3_1: ;then a

bs(i1+i2)

00A9 BE 0008 R mov si,offset VARI1

00AC 8B 04 mov ax,[si] ;ax = i

1

00AE BE 000A R mov si,offset VARI2

00B1 03 04 add ax,[si] ;ax +=

i2 (ax = i1 + i2)

00B3 3D 0000 cmp ax,0 ;cmp i1

+i2,0

#Microsoft (R) Macro Assembler Version 5.10 9/25/19 24:04:53

Page 1-4

00B6 7D 02 jnl f3_1_c ;unless

ax >= 0

00B8 F7 D8 neg ax ;neg ax

00BA f3_1_c: ;else d

ont

00BA 50 push ax ;ret ax

00BB EB 16 90 jmp f3_c

00BE f3_2: ;else m

in(i1,i2)

00BE BE 0008 R mov si,offset VARI1

00C1 8B 04 mov ax,[si] ;ax = i

1

00C3 BE 000A R mov si,offset VARI2

00C6 3B 04 cmp ax,[si] ;cmp i1

,i2

00C8 7F 04 jg f3_2_c ;unless

i1 > i2

00CA 50 push ax ;ret i2

00CB EB 06 90 jmp f3_c

00CE f3_2_c: ;else

00CE FF 34 push [si] ;ret i1

00D0 EB 01 90 jmp f3_c

00D3 f3_c:

00D3 E9 0018 R jmp f3_end

00D6 Main ENDP

00D6 CODE ENDS

END Main

;ENDS C

ODE

#Microsoft (R) Macro Assembler Version 5.10 9/25/19 24:04:53

Symbols-1

Segments and Groups:

N a m e Length Align Combine Class

CODE . . . . . . . . . . . . . . 00D6 PARA NONE

DATASG . . . . . . . . . . . . . 000E PARA NONE 'DATA'

STACKSG . . . . . . . . . . . . 0040 PARA STACK 'STACK'

Symbols:

N a m e Type Value Attr

F1 . . . . . . . . . . . . . . . L NEAR 0021 CODE

F1_1 . . . . . . . . . . . . . . L NEAR 0030 CODE

F1_2 . . . . . . . . . . . . . . L NEAR 0044 CODE

Источник: https://studfile.net/preview/15919957/