Dword c что это
Перейти к содержимому

Dword c что это

Дневники чайника. Чтива 0, виток0

Пятый день.
О словах и двойных словах
(форматы данных)

Не сказать чтоб эта тема была самая сложная, но то, что она самая запутанная — это 100%.

То, что я здесь напишу, довольно туго для восприятия, однако со временем всё уляжется. Не расстраивайтесь, если вдруг в этой главе покажется, что Ассемблер очень сложный, вспомните о таком фокусе.

Не каждый водитель знает, что для того, чтоб машина ехала вперёд, колесо в точке соприкосновения с дорогой должно двигаться назад. Хотя такая информация была сообщена каждому водителю и каждому человеку. Ну, едет машина и едет, какая разница, куда крутятся колёса. Это нужно знать только при смене колёс, чтоб не перепутать направленность резины, или во время ремонта.

Примерно такая же информация будет изложена в этой главе. На практике всё быстро усвоится, если вам придется сталкиваться с машинным кодом и данными.

Матрос, ты должен знать своего друга (со стороны потенциального противника) лучше, чем себя.

Бинарники организуются в отряды по восемь, эти отряды называются байтами. Запомнил?

Байт — это минимальная расчетная единица бинарной армии. Запомнил?

2 байта организуются в слово (word).

4 байта организуются в двойное слово (dword, а пОлно — double word).

Dword — это самый распространённый набор битов в Win32-программах. Так как:

В предыдущей программе мы столкнулись вот с такой строкой:

«d,» здесь как раз и заменяет dword.

Я объяснил, что когда операнд находится в квадратных скобках, при команде mov это означает, что нужно производить действие по адресу в памяти, указанному операндом. То есть в BX раньше должен быть положен адрес. В ходе выполнения этой строки BX не изменяется, изменится только память по адресу, указанному BX. Размер изменяемой памяти dword (4 байта, двойное слово).

Остаётся маленький такой вопросик: почему в дизассемблере байты операндов команд процессора мы видим зеркально значениям операндов в командах Асма?

Запомни, матрос, Бинарники очень хитрые. Для того, чтоб их враг путал байты по старшинству, в каждой целой боевой единице, будь то word (2 байта), dword (4 байта), qword (8 байт), байты строятся от младшего к старшему, черт их дери!

Адрес, который был указан в BX, равен 0133h.

А действие выглядит так:

В отладчике вы видели это вот так:

Мы пишем и читаем текст по-европейски — слева направо. Но для чисел большинство людей использует арабскую запись — справа налево (хотя читаем числа тупо от старшей цифры =).

К великому огорчению, программистами был принят смешанный формат отображения данных. Каждый байт отображается по арабской системе, а целая группа байтов — по европейской. Выходит, что на экране мы видим разную запись. Если программа-дизассемблер или отладчик воспринимают группы байтов как ЦЕЛОЕ число, то оно отображается арабской записью, как в колонке команд Ассемблера: 04 03 02 01, а если речь идёт просто о нескольких байтах, то мы видим европейскую запись, только за букву принят целый байт, что и показано выше: 01 02 03 04. Всё это лишь вопрос отображения на экране или в документах. Например, если использовать запись цифровых значений от нижнего правого угла экрана до верхнего левого (справа налево, снизу вверх), то вообще ничего переворачивать не нужно! То есть если бы была принята запись «справа налево всё» или «слева направо всё», то подобных проблем не было бы вообще.

Допустим, мы набрали вот такую строку:

Здесь мы указали, что размер данных word (2 байта) и эти данные будут помещены в память по адресу 800h.

Объясню сейчас коротко.

Раз мы имеем заданный размер word (или как в Hiew’е «w,»), мы имеем некое ЦЕЛОЕ.

Младший байт (у нас AA) будет находиться по наименьшему адресу, а старший байт (BB) — по более старшему адресу.

Вот как эта строка будет выглядеть в Hiew’e:

Вопрос, который наверняка возник у всех (и я предполагаю, что у многих в нецензурной форме): «На. в смысле зачем?»

Это нужно для того, чтобы процессор забирал байты из памяти, начиная с младшего (так быстрее вычислять). Ведь получается, что адрес числовой переменной любого размера, хоть word, хоть dword, будет указывать на младший байт в числе, далее пойдёт следующий байт в числе, и самый старший байт в числе всегда окажется в конце. Вычислять процессору так значительно быстрее.

Я думаю, что многие читатели совсем запутались, тут есть только одно утешение: перекладывать байты в голове совсем не нужно. Чтобы получить целое число из байтов или, наоборот, из числа сложить байты, достаточно переключить режим отображения в программе. Мало того, при простом программировании можно забыть об этих премудростях и вспоминать лишь изредка.

Всё, из теории остались только циклы и стек, о них мы будем говорить завтра.

Матрос! Я что-то не заметил, чтоб ты разрабатывал кнопку F10!

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

Послезавтра я увижу своё отражение в F10-key у тебя на клавиатуре или я высажу тебя на ближайшей заброшенной планете.

А чтоб было веселей давить на кнопку F10, загони в отладчик следующую программу (prax03.com).

Набивайте всё сами, только так можно научиться.

В Hiew’e она должна выглядеть так:

Но это не всё, теперь переключитесь на Hex-режим (F4) и добейте программу следующими байтами после всего кода. Это будут «данные».

На самом деле все эти пробелы (20h) программе НЕ нужны. Но когда вы будете смотреть программу в отладчике, они вам помогут.

Если у вас будет сдвиг хоть на байт, программа будет ошибочной. Поэтому проверьте, чтобы строка «-=Асм=-$» начиналась с 50h и, что ещё более важно, два нулевых байта (00 00) должны быть в файле по адресам 75 и 76h. Обязательно посмотрите в отладчике, что будет происходить с этими байтами (там они будут 175h и 176h). Всё остальное здесь мишура и для выполнения программы совершенно не имеет значения.

При отладке могут появляться сообщения насчёт экрана. ну и фиг с ними. Если в CV опция Screen Swap ещё не выключена, то это обязательно нужно сделать.

Результат действия этой программы — вывод строк по диагонали от верхнего левого угла до нижнего правого угла.

Здесь очень много нового, и я надеюсь, вам будет интересно узнать, как работают новые команды CMP и JNE.

Попробуйте сами разобраться, что происходит в программе на практике. Как я уже писал, прерываний (команда int) при написании программ Win32 мы использовать не будем. Поэтому можете не заострять на них внимание. Достаточно знать, что это полезные подпрограммы, часть которых заложена ещё в BIOS (basic input/output system — базовая система ввода/вывода).

Я вынужден их использовать только для того, чтобы программа была полноценная и вы могли наглядно изучать главные команды Ассемблера.

В данном примере будут задействованы int 10h для очистки экрана (AL=3) и для расположения курсора текста (AH=2). Ну и int 21h для вывода текста на экран. Всё, других прерываний в уроках больше не будет. О них за долгие годы написано достаточно.

Вот как программа должна трактоваться (сразу скажу — про метки я всё объясню позже).

Перед разбором этой программы я хочу рассказать о ключевом понятии в программировании — циклы.

Dword – вопросы и ответы

progi.pro – один из крупнейших сервисов вопросов и ответов по программированию. У нас вы можете найти вопросы по языкам программирования Javascript, PHP, Java, C#, Python и многим другим.

А так же делитесь знаниями, знакомьтесь с новыми утилитами и приложениями, учитесь у всегда готовых помочь ответить на самые сложные вопросы во всех сферах IT и программирования. Станьте гуру и экспертом разработки ПО, получите признание коллег, заработайте репутацию, создайте стартап или приложение которое будет работать на вас!

c++ — что — Насколько велика DWORD с 32- и 64-битным кодом?

В Visual C ++ DWORD — это просто unsigned long, который зависит от машины, платформы и SDK. Однако, поскольку DWORD является двойным словом (то есть 2 * 16), является DWORD все еще 32-разрядным в 64-битных архитектурах?

8 бит — это байт. 2 байта — это слово. Двойное слово или DWORD — 4 байта или 2 слова.

🙂 на современных процессорах — либо 32-разрядная, либо 64-разрядная. Это просто длина указателя памяти (в свою очередь это емкость ALU).

Но исторически x86 «word» — 16 бит (вместо 32). Таким образом, библиотеки Microsoft, которые исторически ориентированы на x86, определяют DWORD как unsigned long, то есть «размер машинного указателя».

Это все дети. Для дальнейшего использования см. Wikipedia .

Вызов long, dword32, dword64 . все, что вы хотите, но байт — 8 бит, слово — 2 байта, а слово dword (двойное слово) — 2 слова. Qword (quad word) — 4 слова

В 32 или 64-битных системах псевдонимы, такие как LONG или INT, могут различаться, но dword по-прежнему является двойным словом

На самом деле, на 32-битных компьютерах слово 32-битное, но тип DWORD — это остатки старых добрых дней 16-бит.

Чтобы упростить перенос программ в новую систему, Microsoft решила, что все старые типы не изменят размер.

Все зависимые от платформы типы, которые были изменены с переходом от 32-битного к 64-битовому концу с помощью _PTR (DWORD_PTR будет 32-битным в 32-разрядной Windows и 64-разрядной в 64-разрядной Windows).

Нет . на всех платформах Windows DWORD — 32 бита. LONGLONG или LONG64 используется для 64-разрядных типов.

Он определяется как:

Однако, согласно MSDN:

На 32-битных платформах long является синонимом int.

Таким образом, DWORD 32-битная в 32-битной операционной системе. Для 64-битного DWORD существует отдельное определение:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *