Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 14 из 33<  1 ... 11  12  13  14  15  16  17 ... 33  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
L.A.W. писал(а):
Holmes писал(а):
Двумерные массивы не поддерживаются

Кто-ж тебе такое наврал? Все вполне работае.
Т.е. подобный отрезок кода вполне работоспособен:
Код:
masrez   db 4*7 dup(0)
много всего
mov   BX,6
mov   DI,3
mov   masrez[DI][BX],AL

Из твоего примера первая строка определит вектор. Ввиду этого дальнейшая часть примера хоть и будет компилится (и, о чудо, каким-то волшебным образом даже работать так, как ты предполагаешь), но к двумерным массивам имеет отношения не больше, чем танцы к программированию.
Читай учебник!

L.A.W. писал(а):
Holmes писал(а):
Допускается загрузка значений из РОНов в сегментные регистры, равно как и загрузка значений из памяти.

Однако напрямую загрузка значения в сегментный регистр невозможна!

Мое утверждение как-то этому противоречит?



Партнер
 

Member
Статус: Не в сети
Регистрация: 13.08.2005
Holmes писал(а):
Из твоего примера первая строка определит вектор.

А ты думаешь одномерные и двумерные массивы как-то по-разному хранятся в памяти? :-) Двумерные масивы ассемблер вполне поддерживает.
Holmes писал(а):
Мое утверждение как-то этому противоречит?

Сорьки - не ту фразу процитировал. Наводящий вопрос твоя фраза:
Holmes писал(а):
ИМХО, дело в ассемблере, т.е. в трансляторе. Может синтаксис неверен или еще что-нибудь там.

относится к этому вопросу:
M9IC писал(а):
То есть, получается так: mov ds, @data - можно делать? Но так не работает!

?

_________________
I L.A.W. you, baby!
For a GNU dawn! For freedom! :-)


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
L.A.W. писал(а):
Holmes писал(а):
Из твоего примера первая строка определит вектор.

А ты думаешь одномерные и двумерные массивы как-то по-разному хранятся в памяти? :-) Двумерные масивы ассемблер вполне поддерживает.

Приведи пример кода, определяющего матрицу 4х4 и работающего с ней. Предыдущие примеры этого ни коим образом не демонстрируют!

L.A.W. писал(а):
Holmes писал(а):
Мое утверждение как-то этому противоречит?

Сорьки - не ту фразу процитировал. Наводящий вопрос твоя фраза:
Holmes писал(а):
ИМХО, дело в ассемблере, т.е. в трансляторе. Может синтаксис неверен или еще что-нибудь там.

относится к этому вопросу:
M9IC писал(а):
То есть, получается так: mov ds, @data - можно делать? Но так не работает!

?

Я накосячил, имел в виду немного другое.


 

Member
Статус: Не в сети
Регистрация: 15.11.2003
Откуда: Moscow\Russia
Посмотрите пожалуйста мою прогу, она рассчитывает (должна расчитывать :) ) ряд
вот она
http://webfile.ru/1069575

Она содержит ошибки, я незнаю как их исправить, например
mov esi,0
**Error** v34_2.ASM(21) Undefined symbol: ESI
Компилятор не знает о существовании регистра esi ?

или

fmul st(3)
**Error** v34_2.ASM(40) Too few operands to instruction

Какая-то ерунда млин, помогите плиз....


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
Смотрел по диагонали, времени мало:
1. строка 21: в 16-ти битном режиме ESI регистра нету, есть SI.
2. строка 40: ошибся с количеством аргументов
Код:
FMUL ST(0),ST(i)   Replace ST(0) with ST(0) ∗ ST(i).
FMUL ST(i),ST(0)   Replace ST(i) with ST(0) ∗ ST(i).
FMUL mem32real     Replace ST(0) with mem32real ∗ ST(0).
FMUL mem64real     Replace ST(0) with mem64real ∗ ST(0).


p.s. L.A.W. куда-то слился... L.A.W. где пример с матрицей? Я требую примера от признанного эксперта в области программирования на ассемблере! Даешь код!


 

Member
Статус: Не в сети
Регистрация: 04.01.2004
Откуда: 31
Holmes писал(а):
Предыдущие примеры этого ни коим образом не демонстрируют!

Holmes
Очень даже демонстрируют. Насколько я помню то, что нам пихали в универе, это пример от L.A.W. вполне корректен. В теории базовая индексная адресация используется в том числе и для удобства организации работы с двумерными массивами. В базовом регистре хранится номер строки, в индексном номер столбца (или наоборот). Или тебе нужно выделение "квадратного" (т.е не последовательного) куска памяти =)?


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
S.Q.Lapp писал(а):
Очень даже демонстрируют. Насколько я помню то, что нам пихали в универе, это пример от L.A.W. вполне корректен.

Вот именно, что "пихали". Неясно, что впихнули, и осталось ли от этого хоть что-то.

S.Q.Lapp писал(а):
В теории базовая индексная адресация используется в том числе и для удобства организации работы с двумерными массивами. В базовом регистре хранится номер строки, в индексном номер столбца (или наоборот). Или тебе нужно выделение "квадратного" (т.е не последовательного) куска памяти =)?

Иди читать учебник! Тебе показать, как вычисляется адрес, когда применяется "базовая индексная адресация"?


 

Member
Статус: Не в сети
Регистрация: 15.11.2003
Откуда: Moscow\Russia
Holmes писал(а):
FMUL ST(0),ST(i) Replace ST(0) with ST(0) ∗ ST(i).


В учебнике для вузов В.И. Юрова "Assembler 2-е Издание", написано, что это выполняется командой fmul st(i) !!!
Страница 477. Охренеть, научишься так программировать, если автор сам нифига не знает :(

А я тут сижу голову ломаю. :gun:
Добавлено спустя 4 минуты, 9 секунд
Объясните мне еще пожалуйста, в чем разница

n dw 1

n equ 1

???


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
M9IC писал(а):
Объясните мне еще пожалуйста, в чем разница

n dw 1

n equ 1

Примерно такая же, как между
int n = 1;
и
#define n 1

Holmes писал(а):
в 16-ти битном режиме ESI регистра нету, есть SI
Вообще-то в 16-битном режиме есть все регистры, просто доступ к 32-разрядным регистрам в коде идёт с префиксом. Косяк в чём-то другом.


 

Member
Статус: Не в сети
Регистрация: 04.01.2004
Откуда: 31
Holmes писал(а):
Неясно, что впихнули, и осталось ли от этого хоть что-то.

Осталось, не переживай.
Holmes писал(а):
Тебе показать, как вычисляется адрес, когда применяется "базовая индексная адресация"?

Не надо орать. Возьми да покажи.
Цитата:
Адресация по базе с индексированием
Вариант индексной адресации для случая, когда индексируемая область памяти задается своей базой. Например:

mov ax,[bx][si]

Этот тип адресации удобен при обработке двумерных массивов.
Если, например, АОВ есть массив из 10x10 байт вида

var
АОВ: array [0..9,0..9] of Byte;

то для доступа к элементу АОВ [2,3] можно использовать такой фрагмент

mov bx,20 {База строки 2}
mov si,2 {Номер 3-го элемента}
mov ax,AOB[bx] [si] {Доступ к элементу}

Это пример для встоенного асма в паскале.
Чего тебе не нравится? Синтаксис?


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
M9IC писал(а):
Holmes писал(а):
FMUL ST(0),ST(i) Replace ST(0) with ST(0) ∗ ST(i).


В учебнике для вузов В.И. Юрова "Assembler 2-е Издание", написано, что это выполняется командой fmul st(i) !!!
Страница 477. Охренеть, научишься так программировать, если автор сам нифига не знает :(

Может быть он пользовался TASM'ом. Некоторые трансляторы поддерживают редуцированный синтаксис для некоторого множества команд, один из операндов которых всегда является определенным и фиксированным регистром. Если мне не изменяет память, это относится и к TASM'у.

Билли Бонс писал(а):
Holmes писал(а):
в 16-ти битном режиме ESI регистра нету, есть SI
Вообще-то в 16-битном режиме есть все регистры, просто доступ к 32-разрядным регистрам в коде идёт с префиксом. Косяк в чём-то другом.

Косяк в том, что нужно было либо указать префикс, или написать директиву типа ".386" - т.е. разрешить использование 32-х битного кода.
А что за версия MASM'а?

S.Q.Lapp писал(а):
Holmes писал(а):
Тебе показать, как вычисляется адрес, когда применяется "базовая индексная адресация"?

Не надо орать. Возьми да покажи.

Адрес вычисляется следующим образом (по-другому процессоры x86 не умеют):
Код:
offset = base [ + index * { 1 | 2 | 4 | 8 } ] [ + displacement ]

Соответственно, то, что вы приводите в качестве примера это
Код:
offset = base + index

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

S.Q.Lapp писал(а):
Адресация по базе с индексированием
Вариант индексной адресации для случая, когда индексируемая область памяти задается своей базой. Например:

mov ax,[bx][si]

Этот тип адресации удобен при обработке двумерных массивов.
Если, например, АОВ есть массив из 10x10 байт вида

var
АОВ: array [0..9,0..9] of Byte;

то для доступа к элементу АОВ [2,3] можно использовать такой фрагмент

mov bx,20 {База строки 2}
mov si,2 {Номер 3-го элемента}
mov ax,AOB[bx] [si] {Доступ к элементу}
Это пример для встоенного асма в паскале.
Чего тебе не нравится? Синтаксис?

Да всем нравится! Только с этого и надо было начинать, а не вопрошать меня "кто ж тебе такое наврал"!
То, что я выделил в твоем посте - ключевой момент. Ты загружаешь СМЕЩЕНИЕ второй строки, а _не_ ее ИНДЕКС. И далее грузишь номер элемента. Это _не_ называется поддержкой двумерных массивов! Нативная поддержка n-мерных массивов предполагает _автоматическое_ вычисление смещения для любого элемента по его индексам для каждого измерения.


 

Member
Статус: Не в сети
Регистрация: 04.01.2004
Откуда: 31
Holmes писал(а):
Да всем нравится! Только с этого и надо было начинать, а не вопрошать меня "кто ж тебе такое наврал"!

Если тебе всем нравится, почему ты говоришь о том, что
Holmes писал(а):
Предыдущие примеры этого ни коим образом не демонстрируют!

???
Holmes писал(а):
Нативная поддержка n-мерных массивов предполагает _автоматическое_ вычисление смещения для любого элемента по его индексам для каждого измерения.

Бред какой-то. Во-первых, никто не говорил о поддержке n-мерных массивов. А для 2-мерных всё как раз прекрасно вычисляется. Сам же и написал
Holmes писал(а):
Адрес вычисляется следующим образом (по-другому процессоры x86 не умеют): Код:
offset = base [ + index * { 1 | 2 | 4 | 8 } ] [ + displacement ]

Правда масштаб появился только в 32 разрядах.
Добавлено спустя 6 минут, 26 секунд
Holmes писал(а):
Ты загружаешь СМЕЩЕНИЕ второй строки, а _не_ ее ИНДЕКС.

Вот тут ты прав... смещение надо считать :roll:


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
S.Q.Lapp писал(а):
Holmes писал(а):
Да всем нравится! Только с этого и надо было начинать, а не вопрошать меня "кто ж тебе такое наврал"!

Если тебе всем нравится, почему ты говоришь о том, что
Holmes писал(а):
Предыдущие примеры этого ни коим образом не демонстрируют!

???

Да потому что и ты, и некоторые другие ораторы, выбрасывают ключевые моменты из примеров, а потом утверждают, что "все прекрасно работает".

S.Q.Lapp писал(а):
Holmes писал(а):
Нативная поддержка n-мерных массивов предполагает _автоматическое_ вычисление смещения для любого элемента по его индексам для каждого измерения.

Бред какой-то. Во-первых, никто не говорил о поддержке n-мерных массивов. А для 2-мерных всё как раз прекрасно вычисляется.

Бред? Во-первых, не придирайся к словам. Во-вторых, в теории ты не силен, просто скажи, что тебе сложно вместо n доставить 2, и привести это утверждение к частному виду для двумерного массива.
Такой вариант более понятен?
Нативная поддержка двумерных массивов предполагает _автоматическое_ вычисление смещения для любого элемента по его индексам для обоих измерений.

S.Q.Lapp писал(а):
Сам же и написал
Holmes писал(а):
Адрес вычисляется следующим образом (по-другому процессоры x86 не умеют): Код:
offset = base [ + index * { 1 | 2 | 4 | 8 } ] [ + displacement ]

Правда масштаб появился только в 32 разрядах.
Добавлено спустя 6 минут, 26 секунд
Holmes писал(а):
Ты загружаешь СМЕЩЕНИЕ второй строки, а _не_ ее ИНДЕКС.

Вот тут ты прав... смещение надо считать :roll:

Раз смещение надо считать самому, значит поддержки двумерных массивов нет!
Или ты и после этого будешь утверждать, что в ассемблере есть поддержка двумерных массивов?

p.s. Для справки - масштаб (1, 2, 4 и 8) был введен не для поддержки двумерных массивов, как ты здесь настойчиво утверждаешь, а для более удобной адресации байт, слов, двойных и счетверенных слов.


 

Member
Статус: Не в сети
Регистрация: 04.01.2004
Откуда: 31
Не надо наезжать. Я уже написал, что был не прав.

Holmes писал(а):
p.s. Для справки - масштаб (1, 2, 4 и 8) был введен не для поддержки двумерных массивов, как ты здесь настойчиво утверждаешь, а для более удобной адресации байт, слов, двойных и счетверенных слов.

Вот этого я как раз не утверждал, тем более настойчиво. И говорил я это совсем не к массивам, а к разрядам асма.


 

Member
Статус: Не в сети
Регистрация: 30.06.2005
Откуда: Питер
S.Q.Lapp писал(а):
Не надо наезжать. Я уже написал, что был не прав.

ok ;)


 

Member
Статус: Не в сети
Регистрация: 15.11.2003
Откуда: Moscow\Russia
Вот накатал прогу, вычисляющую ряд.
http://webfile.ru/1071653

Объясните мне одну весчь, почему когда начинает выполняться вложенный цикл, после команды fld prev (строка 37), в стек сопроцессора загружается не единица, а 1.4ххххххххххх
Это видно вот на этой картинке
http://webfile.ru/1071654


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Holmes писал(а):
Косяк в том, что нужно было либо указать префикс, или написать директиву типа ".386" - т.е. разрешить использование 32-х битного кода.
Точно, .386 надо... Блин, сколько лет уже прошло - всё позабывал. :(

M9IC А зачем ты mov prev, 1 написал? Тогда fild prev нужен, а не fld. И с result'ом тоже разберись.


 

Member
Статус: Не в сети
Регистрация: 15.11.2003
Откуда: Moscow\Russia
ну потому что
mov prev, 1.0
не пашет, а использовать fild не могу т.к. prev должна быть дробной, это только вначале цикла она единица....млин надо подумать...как их перед циклом "объединичить"
Добавлено спустя 3 минуты, 16 секунд
наверное надо будет переписать этот участок кода
mov prev,1
mov result,1

вот так
fld1
fst prev
fstp result
Добавлено спустя 4 минуты, 2 секунды
Да так вроде бы все работает как надо =) Спасибо!
А то я так бы мучался очень долго!
Люблю overclockers.ru =)


 

Member
Статус: Не в сети
Регистрация: 24.12.2005
Хранил бы лучше результаты в регистрах сопра, а не в память их копировал, и проблем бы не было.


 

Member
Статус: Не в сети
Регистрация: 15.11.2003
Откуда: Moscow\Russia
ну я так уже и сделал, но вот только в итоге всеравно надо чтоб получился массив результатов в памяти - задание такое


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 641 • Страница 14 из 33<  1 ... 11  12  13  14  15  16  17 ... 33  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2


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

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan