Консультация № 198857
06.06.2020, 21:42
0.00 руб.
07.06.2020, 00:49
0 8 1
Уважаемые Игорь Витальевич, и эксперты,
здравствуйте,

MASM 6.11/13 для DOS, Windows 7, 64-bit, DOS Box Emulator.

написал простой Листинг для экспериментирования (см. присоединенный файл).

AfdPro показывает, что для второго набора команд в коде,

[code lang=asm]mov si,1
mov bx,mas1[si]
add ax,bx[/code]

в регистр BX заносится 0700h, а не 0007h.

подскажите, пожалуйста, почему в данной ситуации возникает такой "артефакт" ?

Спасибо.

---------------------------------------
[code lang=asm]Cseg1 segment
org 100h

_start:

xor ax,ax

mov si,0
mov bx,mas1[si]
add ax,bx

mov si,1
mov bx,mas1[si]
add ax,bx

mov si,1d

int 20h

mas1 dw 4,7,1,9
dw 0,3,5,8
dw 6,2

Cseg1 ends
end _start[/code]

Обсуждение

давно
Посетитель
401339
51
06.06.2020, 23:03
общий
Адресаты:
Уважаемые Игорь Витальевич, и эксперты,
здравствуйте,

я немного "поиграл" с MASM.

так вот, результаты следующие,

1) запись

mas1 dw 4,7,1,9
dw 0,3,5,8
dw 6,2

означает, что на каждый элемент массива, mas1, выделяется по два байта в ОЗУ-памяти.

2) далее, следующая запись,

mov si,1
mov bx,mas1[si]
add ax,bx

означает, что в регистр SI заносится 1, то есть фактически он как-бы указывает на первый байт (!!!) (а не элемент, как в C/C++), относительно "базы", где под термином "база" понимается нулевой (в смысле, по-порядку) байт (!!!) данного массива.

поэтому, все правильно - в AfdPro регистр BX и показывает значение 0700h, так как в данном случае (коде) первый байт (!!!, а не элемент массива) равен 0 (заполнен двоичными нулями).

эксперимент с MASM (для DOS) показывает, что следующая запись,

mov si,1
mov bx,mas1[si*2]

является неправильной (!!!). в этом случае компилятор (транслятор), ml.exe file1.asm /AT, выдает ошибку. то есть так нельзя (!!!) индексировать элементы массива, и таким образом нельзя писать код на MASM-ассемблере.

вывод: регистр SI указывает (или, describes) номера байтов по-порядку, в данном случае для массива (или, внутри массива) mas1.

Спасибо.
давно
Старший Модератор
31795
6196
08.06.2020, 11:55
общий
Адресаты:
Вы везде упоминаете байт, байт, байт, а определили массив как слово, двойной байт.

Адресация индексирование с маштабированием появилась в .386 процессоре и применяется к регистрам Ехх.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401339
51
08.06.2020, 21:43
общий
Адресаты:
Уважаемый Константин Николаевич, Игорь Витальевич, и эксперты,
здравствуйте,

1) Константин Николаевич, спасибо за Ваше ответное (the latter) сообщение. вот теперь, мы уже говорим немного о разных вещах. наверное, потому, что не понимаем друг друга (в смысле - см. чуть ниже).

2)
> ... но я рад за Вас - Вы начали думать.

Дякуємо. багато в чому, це Ваша заслуга.

3) Константин Николаевич, ... я понимаю, что Вы, Игорь Витальевич, и Ваши коллеги-программисты из Петрограда-Ленинграда, и из других городов экс-СССР посвятили много времени (и, даже, лет (годов)) для программирования на MASM/TASM (DOS), MASM32, MASM64 (и т.п.), и на программирование микроконтроллеров, с использованием С/С++, и Ассемблеров. я это хорошо понимаю, так как сам потратил много лет (годов) на физику, математику, и программирование, но в финансовом (денежном) смысле это (научные разработки) никак не окупилось, до сих пор, и не окупится, лично, для меня, в ближайшее время в России.

4) Константин Николаевич, ... AfdPro, MASM/TASM и т.п. (в Windows, или в Linux) это, по-сути, обычные (!!!) компьюетерные программы (приложения, software, executable), которые разрабатывались (написаны) другими людьми в разных (!!!) странах.

5) Константин Николаевич, ... вот поэтому у Вас и возникли, и будут (!!!) возникать такие, и подобные вопросы: "... байты, байты, ... адресация индексирование с масштабированием появилась ..."

Константин Николаевич, и Игорь Витальевич, ... мені складно щось Вам сказати. спробуйте трохи підкоп грошей, і поїдьте орагнізованно (!!!!!) разом зі своїми рідними в Європу, і в США. подивіться архітектуру, погуляйте в міських парках, по-можливості зробіть недорогі покупки, для себе, і для своїх рідних, в хороших торгових центрах на Заході, відпочиньте, поїжте ласощі.

тем временем, я попытаюсь, немного, еще-раз (будем продолжать) "поиграть" с MASM/TASM (для DOS). если возникнут вопросы, и не смогу найти ответы в Интернет, то задам их (вопросы) на Вашем форме, RfPro.ru.

Всього Вам найкращого, успіхів, і удачі.
давно
Старший Модератор
31795
6196
09.06.2020, 12:52
общий
Адресаты:
Ну, Ваш украинский оставляет желать лучшего.

Но все равно спасибо!

Теперь по вопросу:
Байт - минимальная адресуемая ячейка памяти. Вы определили массив как слова:
[code lang=asm]mas1 dw 4,7,1,9
dw 0,3,5,8
dw 6,2 [/code]
В слове 16-ть бит = 2 байта = старший и младший байты. По правилам Intel'а в память первым пишется младший байт, потом старший. На рисунке это видно.


Запись dw 4 равна запись db 4,0. Т.е. dw 4,7,1 равно db 4,0,7,0,1,0
Изменяя значение SI на один, Вы переходите к не следующему элементу массива, а к следующему байту.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401339
51
09.06.2020, 20:57
общий
Адресаты:
Уважаемый Константин Николаевич, Игорь Витальевич, и эксперты,
здравствуйте,

> Теперь по вопросу: ...
...
> Изменяя значение SI на один, Вы переходите к не следующему элементу массива, а к следующему байту.

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

No. байтов | 0 1 2 3 4 5 ...
-------------------------------------------------
DS:0118 | 20 04 00 07 00 01 ..... % это шестнадацатиричные (!!!) значения, записанные в байтах

термин "байт", (кто-то называет это "ячейкой памяти", хотя это не правильно) можно схематически (!!!, но на микроэлектронном уровне это не так, на самом-то деле) представить как (схема 2),

номер разряда: 7 6 5 4 3 2 1 0
значения: * * * * * * * *

где под звездочкой, *, понимаются (то есть звездочка может принимать значения) значения либо 0, либо 1.

> Теперь по вопросу: ...

Константин Николаевич, и Игорь Витальевич, ... я Вам уже написал в предыдущем сообщении, что AfdPro, другие дебагеры (4-, 8-, 16-, 32-, 64-битные), а также, соответствующие Ассемблеры (это обычные executable програмки, приложения, софт, то есть, уже, не ASCII-коды (листинги на каки-либо компьютерных языках)) - MASM (16-, 32-, 64-битные), TASM, NASM, FASM и другие, были написаны (и до сих пор пишутся) другими (то есть, разными, different !!!) людьми (которые, не владеют теми предметами, которые Вы изучали в экс-Советских ВУЗах, и средних школах) в разных (!!!) странах.

Константин Николаевич, и Игорь Витальевич, ... к сожалению, так оно и есть.

> Теперь по вопросу: ...

Константин Николаевич, и Игорь Витальевич, ... в связи со сказанным выше, AfdPro debuger, в частности (!!!), написан для "потребностей" каких-то других (!!!, other, and different) людей, то есть не для экспертов, и, даже, обычных пользователей Вашего Форума RfPro.ru.

> Теперь по вопросу: ...

данный массив, mas1, (я ограничусь, для простоты, первыми 4-мя (четырьмя) элементами, так как не хватит места на экране компьютера),
mas1 dw 4,7,1,9
необходимо, представить (!!!, то есть вообразить, для простоты понимания) схематически (!!!) в памяти (ОЗУ) компьютера, как (схема 3),

... 00 09 00 01 00 07 00 04 ...

где я сгруппировал числа (шестнадцатиричные !!!) по парам, то есть, например,

00 04 - это означает "слово-word", dw (define as "word"), то есть, означает, 2 (два) байта (что такое "байт", я вкратце описал выше), кто-то еще говорит так - 2 байта информации, которая (информация, в двоичном пресдтавлении) занимает место в ОЗУ (оперативное запоминающее "устройство" или Random Accecc Memory, RAM) памяти.

> Теперь по вопросу: ...

пусть, например, в индексовый регистр, SI, занесено число 0 (нуль). это просто означает, что как-бы (!!!) данный регистр "указывает" (или, точнее, соответствует) нулевому (!!!) байту в (!!!) данном (!!!) массиве, mas1, - кто-то называет это еще 0 (нулевым смещением, то есть нулевой (в смысле, по-порядку, или нумерация байтов в массиве) элемент (!!!, или байт) по-порядку (!!!)) в массиве, mas1, то есть,

SI=0 указывает на байт=04 (в шестнадцатиричном формате),

далее,

SI=1 указывает на байт=00 (в шестнадцатиричном формате),

далее,

SI=0 указывает на байт=07 (в шестнадцатиричном формате),

далее,

SI=1 указывает на байт=00 (в шестнадцатиричном формате),

далее,

SI=0 указывает на байт=01 (в шестнадцатиричном формате),

далее,

SI=1 указывает на байт=00 (в шестнадцатиричном формате),

далее,

SI=0 указывает на байт=09 (в шестнадцатиричном формате),

далее,

SI=1 указывает на байт=00 (в шестнадцатиричном формате),

... (и так далее),

> Теперь по вопросу: ...

так вот, когда, SI=1, то он как-бы "указывает" (соответствет) на "ячейку" (микроэлектронную) памяти (называйте, это как хотите, можете как "байт"), где "записано" число 00 (в шестнадцатрчином формате).
при этом, слева (смотрите схему 3, выше) от это "ячейки" (байта), находится, другая "ячйка" (другой байт), где "записано" число со значением равным 07 (в шестнадцатиричном представлении).

следовательно, в регистр BX заносится число 07 00, то есть BX = 07 00.

почему происходит вот такое непонятное (!!!) разногласие (то есть, несоответствие) между данными (шестандцатиричными числами) в разных окошках в таблице, которая показывается в AfdPro-дебагере, я Вам уже полностью (in comprehensive way) объяснил (см. выше).


> Ну, Ваш украинский оставляет желать лучшего ...

приймемо Ваше зауваження до уваги. постараємося виправлятися (хоча, ніяких гарантій не даю).

сподіваюся дане моє повідомлення допоможе Вам у Вашій роботі по Вашій професії (спеціальності), яку Ви отримали в військовому-технічному ВУЗ.

Всього Вам найкращого.

давно
Старший Модератор
31795
6196
09.06.2020, 23:55
общий
10.06.2020, 00:01
Адресаты:
Цитата: Ильдар Рифович Альмиев
термин "байт", (кто-то называет это "ячейкой памяти", хотя это не правильно) можно схематически (!!!, но на микроэлектронном уровне это не так, на самом-то деле) представить как (схема 2),

номер разряда: 7 6 5 4 3 2 1 0
значения: * * * * * * * *

С точки зрения схемотехники, т.е. организации логической схемы памяти в некотором устройстве, эти биты могут находится в разних микросхемах , т.е. одна м/сх, к примеру №3 - отвечает за бит №3, другая, к примеру №6 - за бит №6. На модуль памяти подается адрес байта, он разводится на разные м/сх-мы, подается команда чтения данных, подается "строб" и вуаля-на выходных контактах модуля сожержимое байта, поступает в шину данных устройства, где блок-приемник - эти данные считает, т.е. получит информацию. Такая организация проже схемного решения, где нужно дополнительно устраивать различного рода дешифраторы строк-колонок м\сх.


Цитата: Ильдар Рифович Альмиев
я Вам уже написал в предыдущем сообщении, что AfdPro, другие дебагеры (4-, 8-, 16-, 32-, 64-битные), а также, соответствующие Ассемблеры (это обычные executable програмки, приложения, софт, то есть, уже, не ASCII-коды (листинги на каки-либо компьютерных языках)) - MASM (16-, 32-, 64-битные), TASM, NASM, FASM и другие, были написаны (и до сих пор пишутся) другими (то есть, разными, different !!!) людьми (которые, не владеют теми предметами, которые Вы изучали в экс-Советских ВУЗах, и средних школах) в разных (!!!) странах.


Я Вам открою секрет, только ни кому не говорите, ОСь
Цитата: Ильдар Рифович Альмиев
Windows или Linux

Тоже
Цитата: Ильдар Рифович Альмиев
это обычные executable програмки, приложения, софт

Вы говорите
Цитата: Ильдар Рифович Альмиев
это обычные executable програмки, приложения, софт, то есть, уже, не ASCII-коды (листинги на каки-либо компьютерных языках)

Вот Вам ещё одна схема:

Круг - это то, что я Вам набираю в качестве ответа.
блокнот - сохраняю файл, дальше открываю его в AFDPRO, дальше коды ASCII(соответсвие проверьте по таблице), те которые набрал блокноте.
Запустите в командной строке и ОСь - нормально отработает то, "что не важно".

Цитата: Ильдар Рифович Альмиев
SI=0 указывает на байт=04 (в шестнадцатиричном формате),
далее,
SI=1 указывает на байт=00 (в шестнадцатиричном формате),
далее,
SI=0 указывает на байт=07 (в шестнадцатиричном формате),
далее,
SI=1 указывает на байт=00 (в шестнадцатиричном формате),
далее,
SI=0 указывает на байт=01 (в шестнадцатиричном формате),
далее,
SI=1 указывает на байт=00 (в шестнадцатиричном формате),
далее,
SI=0 указывает на байт=09 (в шестнадцатиричном формате),
далее,
SI=1 указывает на байт=00 (в шестнадцатиричном формате),

Все это можно "в трубочку скуртить", т.к. используется одна команда mov bx,mas1[ s i ], где mas1 = 119, см. картинку выше. Либо SI=0 лиюл SI=1, но при этом 119 не меняется, т.е. читается ДВА БАЙТА как не крути, но либо с адресса 119, любо с адреса 11А.

Цитата: Ильдар Рифович Альмиев
следовательно, в регистр BX заносится число 07 00, то есть BX = 07 00.

Разногласия в понимании, ВХ = 700h - BH=07, BL=00h. -первым читается младший байт, вторым старший
Я уже писал это:
Цитата: Зенченко Константин Николаевич
По правилам Intel'а в память первым пишется младший байт, потом старший


А теперь, то что Вы должны запомпить, схемотехника и программирование - ДВЕ РАЗНЫЕ ВЕЩИ.
Схемотехника(как разработчика) - Не волнует, как его схема будет кодится, кодера Не волнует как это все орзанизовано, и пока Вы не будете различать две эти плоскости у Вас будет путаница в голове.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
401339
51
10.06.2020, 00:57
общий
Адресаты:
Уважаемый Константин Николаевич, Игорь Витальевич, и эксперты,
здравствуйте,

> С точки зрения схемотехники, т.е. организации логической схемы памяти в некотором устройстве, эти биты могут находится в разных микросхемах ...

спасибо, за данную подсказку.

> ... открою секрет, только ни кому не говорите ...

также, большое спасибо, за данную подсказку. я это понимаю.

> Вот Вам ещё одна схема ...

спасибо за подсказку.

> По правилам Intel'а в память первым пишется младший байт, потом старший ...

спасибо за объяснение.

> пока Вы не будете различать две эти плоскости (схемотехника и программирование) у Вас будет путаница в голове ...

я очень хорошо различаю (have been distinguishing) это (схемотехнику и программирование).
поэтому, у меня нет (!!!!!, то есть, отсутствует !!!!!) перемешивание (смешивание, путаницы) научной информации (и понимания) о схемотехнике, и программировании. это просто означает, что когда, например, мне удается (точнее удавалось в прошлом) (имеется возможность, и официальные, и довольно хорошо оплачиваемые проекты) кодировать на С, С++, Фортране, то я никогда не думал (и не думаю), например, о ТТЛ, ДТЛ, тригерах, АЦП-ЦАП, и каким образом они устроены, и функционируют, и тому подобное. тоже, самое справедливо, и когда я нахожу время программировать, и читать статьи в Интернете об Ассемблерах (to learn Assemblers).

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

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

ще раз, велике спасибі за дуже цінні, і професійні підказки.
давно
Старший Модератор
31795
6196
11.06.2020, 13:51
общий
это ответ
Здравствуйте, Ильдар Рифович Альмиев!

Команда mov bx,mas1[si] читает слово по адресу: mas1 + si
  • во время компиляции процессор подставляет вместо mas1 реальный адрес в памяти, в данном случае 0х0119;
  • слово читается так: в младший байт 16-ти битного регистра попадает значение, на которое указывает адрес, в старший - следующий байт;
  • изменяя si - можно добраться к любому адресу относительно mas1. В коде si - принимает значение 0х0000 и 0х0001, поэтому будут читаться BL с адреса 0х0000 BH с адреса 0х0001, при si равном 0х0000 и BL с адреса 0х0001 BH с адреса 0х0002, при si равном 0х0001;
  • массивы проще считывать строковыми командами LODS, при этом в АХ - будет очередной элемент массива, также автоматически изменится SI - на величину(размер в байтах) элемента массива.


Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа