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
Статус: Не в сети Регистрация: 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. Охренеть, научишься так программировать, если автор сам нифига не знает
А я тут сижу голову ломаю. Добавлено спустя 4 минуты, 9 секунд Объясните мне еще пожалуйста, в чем разница
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
согласись, что это ни разу не похоже на вычисление смещения для обращения к элементу двумерного массива. Это лишь часть этих вычислений. См. ниже.
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
Статус: Не в сети Регистрация: 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 писал(а):
Ты загружаешь СМЕЩЕНИЕ второй строки, а _не_ ее ИНДЕКС.
Вот тут ты прав... смещение надо считать
Раз смещение надо считать самому, значит поддержки двумерных массивов нет!
Или ты и после этого будешь утверждать, что в ассемблере есть поддержка двумерных массивов?
p.s. Для справки - масштаб (1, 2, 4 и 8) был введен не для поддержки двумерных массивов, как ты здесь настойчиво утверждаешь, а для более удобной адресации байт, слов, двойных и счетверенных слов.
Member
Статус: Не в сети Регистрация: 04.01.2004 Откуда: 31
Не надо наезжать. Я уже написал, что был не прав.
Holmes писал(а):
p.s. Для справки - масштаб (1, 2, 4 и 8) был введен не для поддержки двумерных массивов, как ты здесь настойчиво утверждаешь, а для более удобной адресации байт, слов, двойных и счетверенных слов.
Вот этого я как раз не утверждал, тем более настойчиво. И говорил я это совсем не к массивам, а к разрядам асма.
Объясните мне одну весчь, почему когда начинает выполняться вложенный цикл, после команды fld prev (строка 37), в стек сопроцессора загружается не единица, а 1.4ххххххххххх
Это видно вот на этой картинке
http://webfile.ru/1071654
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 =)
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 2
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения