Форум программистов, компьютерный форум, киберфорум
Наши страницы
Assembler для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Jin_Hunt
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 14
1

Табличная функция

09.12.2014, 15:52. Просмотров 1007. Ответов 6
Метки нет (Все метки)

Доброго времени суток, уважаемые форумчане!
Столкнулся с проблемой:
Нужно было составить программу для расчета φ(B)=tg(B) на языке Assembler, где B=[28..34] с заданной погрешностью: δ= 5%.

δ= (φ(B)-φприближ(B))/(φ(B)max-φ(B)min)
, где φ(B)приближ - приближенное знач. фун в заданном аргументе
φ(B)max,min - максимальное и минимальное значения фун в области определения B/

Я нашел точные значения tg на всем интервале:
x,град ˚ tan(x)
28 0,531709 φmin(B)
29 0,554309
30 0,57735
31 0,600861
32 0,624869
33 0,649408
34 0,674509 φmax(B)

С учетом вышеизложенного , зная что Δ = (φ(B)-φприближ(B)), нахожу коридор допустимых значений.
Δ ≈ 0,01
Тогда
x,град ˚ tan(x) Δ- Δ+
28 0,531709 0,521709 0,541709
29 0,554309 0,544309 0,564309
30 0,57735 0,56735 0,58735
31 0,600861 0,590861 0,610861
32 0,624869 0,614869 0,634869
33 0,649408 0,639408 0,659408
34 0,674509 0,664509 0,684509

Строю график:
Табличная функция

Определил необходимый шаг, для того, чтобы погрешность не выходила за 5%:
δ(шаг)≈0,31.

С учетом этого шага, создал таблицы аргументов и соответствующих функций:
ARGUM DW 28000, 28312, 28622, 28930
DW 29236, 29541, 29843
DW 30144, 30443, 30740
DW 31036, 31329, 31621, 31911
DW 32199, 32485, 32770
DW 33052, 33333, 33612, 33890
DW 34165

{задаем таблицу значений tg(B)}
FUN DW 532, 539, 546, 553
DW 560, 567, 574
DW 581, 588, 595
DW 602, 609, 616, 623
DW 630, 637, 644
DW 651, 658, 665, 672
DW 679

Далее, начал реализовывать программу.
Фрагмент:
modul 1.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
TITLE laba10_1
PAGE   ,132
PUBLIC TAN, SQRTA ; объявляем процедуры доступные для др. модулей
STK     SEGMENT PARA    STACK   'STACK'
         DB      5       DUP('STACK   ')
STK     ENDS
 
DSEG    SEGMENT PARA    PUBLIC  'DATA'
 
{задаем таблицу аргументов B}
ARGUM   DW 28000, 28312, 28622, 28930
    DW 29236, 29541, 29843
    DW 30144, 30443, 30740
    DW 31036, 31329, 31621, 31911
    DW 32199, 32485, 32770
    DW 33052, 33333, 33612, 33890
    DW 34165
 
{задаем таблицу значений  tg(B)}
FUN DW 532, 539, 546, 553
    DW 560, 567, 574
    DW 581, 588, 595
    DW 602, 609, 616, 623
    DW 630, 637, 644
    DW 651, 658, 665, 672
    DW 679
 
DSEG ENDS
 
SUBTTL
              PAGE
CSEG    SEGMENT PARA    PUBLIC  'CODE'
ASSUME  CS:CSEG,SS:STK,DS:DSEG
 
{ПРОЦЕДУРА ДЛЯ ОПРЕДЕЛЕНИЯ ФУНКЦИИ(ВНАЧАЛЕ AX- АРГУМЕНТ, В КОНЦЕ AX – ЗНАЧЕНИЕ tg(B)}
TAN proc FAR
    PUSH DX  {ПОМЕСТИТЬ В СТЕК РЕГИСТР DX}
    PUSH CX {ПОМЕСТИТЬ В СТЕК РЕГИСТР CX}
    PUSH BX {ПОМЕСТИТЬ В СТЕК РЕГИСТР BX}
    MOV DI, 0 { ОБНУЛЯЕМ СЧЕТКЧИК DI}
 
OPR_A:  ADD DI, 2 ; { ЗАПИСЫВАЕМ В СЧЕТЧИК ЗНАЧЕНИЕ 2-  Di<-DI+2}
    MOV CX, ARGUM[DI] ;  {ЗАПИСЫВАЕМ  В CX  прав.часть интервала ARGUM[DI]}
    CMP CX, AX ; {СРАВНИВАЕМ Выбранное число с табл: если CX<AX , то}
    JS OPR_A ; {ПЕРЕЙТИ К OPR_A}
    SUB CX,AX ;{ ИНАЧЕ В CX  ИДЕТ РАЗНОСТЬ ТАБЛ. И ВЫБР.ЧИСЛА CX – AX}
    MOV DX, AX ; {ЗАПИСЫВАЕМ В DX ЗНАЧЕНИЕ ВЫБРАННОГО АРГУМЕНТА}
    SUB DX, ARGUM[DI-2] {Записываем в DX лев. часть интервала DX -ARGUM[DI-2]}
    CMP CX, DX ;  {если CX<DX, то}
    JS NEXT ; { перейти к NEXT,}
    SUB DI, 2 ; {иначе уменьшаем интервал  DI <- DI – 2}
NEXT:   MOV AX, FUN[DI] ; { ЗАПИСЫВАЕМ В АХ ПОДХОД ЗНАЧ. ТАНГЕНСА}
    POP BX {ИЗВЛЕКАЕМ ИЗ СТЕКА РЕГИСТР BX}
    POP CX {ИЗВЛЕКАЕМ ИЗ СТЕКА РЕГИСТР CX}
    POP DX{ИЗВЛЕКАЕМ ИЗ СТЕКА РЕГИСТР DX}
    RET
...
Все бы ничего, но мне сказали, что нерационально сделано( для микроконтроллеров занимает память)
Т.е. не нужно было задавать таблицу аргументов(ARGUM), а нужно по заданному аргументу( к примеру,30) и шагу, сопоставить значения этого аргумента в таблице значений арфгумента (FUN).
Т.е. каждое значение (FUN) имеет свой номер, которое соответствует своему аргументу.

Вопрос: Как мне изменить строки 42-51, не меняя при этом весь код модуля, чтобы обойтись без таблицы аргументов, и подобрать для необходимого аргумента из интервала 28..34 (к примеру 30) значение функции?

Спасибо.

с ув.Андрей.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.12.2014, 15:52
Ответы с готовыми решениями:

Табличная замена символов
У меня есть прога по преобразованию ASCII строки в шестнадцатеричный код с...

Табличная функция
Здравствуйте, нужно создать многострочную табличнозначную функцию пользователя...

Табличная функция
Есть таблица с одним столбцом. В функции передаю два строковых массива со...

Хранимая процедура или табличная функция?
Если мне нужно получить упорядоченую выборку, зависящую от двух параметров, и...

Табличная верстка :(
Здравствуйте. Нужно сделать страницы, как в прикрепленных изображениях....

6
Mikl___
Автор FAQ
13304 / 6377 / 629
Регистрация: 11.11.2010
Сообщений: 11,537
09.12.2014, 16:34 2
Jin_Hunt,
посмотри табличное вычисление синуса в FAQ для раздела Assembler, MASM, TASM http://www.cyberforum.ru/cgi-bin/latex.cgi?\rightarrow "Синус на ассемблере"
0
Jin_Hunt
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 14
09.12.2014, 20:44  [ТС] 3
Mikl___,
Спасибо за информацию. Ознакомился, но мне не все ясно. Я понимаю приницип, но плохо понимаю синтаксис языка.
Если вас не затруднит, не могли бы вы дать комментарии вот этому фрагменту:
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
...
.code
proc find_sin
    push eax
    cmp eax,181
    jb a2
    sub eax,180
    cmp eax,91
    jb a1
    neg eax
    add eax,180
a1: mov ebx,sin[eax*4]
    neg ebx
    jmp a4
a2: cmp eax,91
    jb a3
    neg eax
    add eax,180
a3: mov ebx,sin[eax*4]
a4: pop eax
    retn
endp find_sin
0
Thread
programmer
1871 / 343 / 27
Регистрация: 01.06.2011
Сообщений: 3,047
Записей в блоге: 1
09.12.2014, 21:17 4
Jin_Hunt,

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

Добавлено через 1 минуту
Цитата Сообщение от Jin_Hunt Посмотреть сообщение
Как мне изменить строки 42-51
как вычисляли аргументы так и высчитывайте индекс.
0
Jin_Hunt
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 14
09.12.2014, 21:18  [ТС] 5
Thread,
Проблема в том, что я не пойму как это написать на Assembler.

Искал подобные примеры, мне - начинающему программисту - не все понятно.
Только начал работать с Assembler
0
Thread
programmer
1871 / 343 / 27
Регистрация: 01.06.2011
Сообщений: 3,047
Записей в блоге: 1
09.12.2014, 22:07 6
Лучший ответ Сообщение было отмечено Jin_Hunt как решение

Решение

Jin_Hunt,

ну так у тебя примерно 0.31 шаг.Масштабирование на 1000.
вычили до тысячной и будет тебе шаг .
от 28000 и считай индекс. (B - 28000) / h.
примерно так.

Assembler
1
2
3
4
5
6
7
SUB ,AX,28000
MOV BX,310    ;BX = h = 310 
XOR DX,DX
DIV  BX ;AX = индекс
MOV DI,AX
SHL DI,2
MOV AX,FUN[DI] ;значение из таблицы
1
Jin_Hunt
0 / 0 / 0
Регистрация: 15.02.2014
Сообщений: 14
10.12.2014, 16:49  [ТС] 7
Thread, спасибо большое, разобрался!
Учту на будущее!
0
10.12.2014, 16:49
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.12.2014, 16:49

табличная верстка
товарищи подскажите как сделать мне ссылки в подвале, что бы они были по левому...

Табличная верстка
Народ, подскажите, пожалуйста, на сегодняшний день актуально ли учится...

1С 7.7 Табличная часть
Необходимо в всей табличной части в определенном столбце во всех строках...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru