Вариант 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
Сегменты в программе размещены в порядке:
Стек
Данные
Код
В сегменте данных заданы метки для переменных 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