Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.85/141: Рейтинг темы: голосов - 141, средняя оценка - 4.85
 Аватар для ТотКтоНадо
-8 / 1 / 0
Регистрация: 11.12.2011
Сообщений: 364

Команда cwd и ее назначение

26.02.2012, 08:01. Показов 26741. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
CWD преобразование слова в двойное слово.Команда CWD копирует значение старшего бита
регистра АХ на все биты регистра DX;
mov al , -l ;AL = -1 (или OxFF)
CWD ;знаковое расширение на весь АХ
Тока никакого копирования я не вижу. Рассажите назначение этой команды

и cwde тож не понимаю
CWDE копирует старший бит АХ в верхнюю часть (старшую часть) ЕАХ, расширяя таким образом
оригинальное значение АХ в двойное слово со знаком, которое будет помещено в регистр ЕАХ.
mov al , -l ;AL = -1 (или OxFF)
CWDE ;знаковое расширение на весь АХ
1
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.02.2012, 08:01
Ответы с готовыми решениями:

CWD в директорию с пробелами в имени
Привет всем! Хочу немного автоматизировать свою работу. Решил написать скрипт, который коннектится к ftp серверу, проверяет на наличие...

Что будет в регистре dx после выполнения инструкции cwd
ax = E805h после выполнения команды cwd чему будет равен dx?

32.Модуль в Паскале (Unit), его назначение, структура модуля, назначение и описание частей модуля
32.Модуль в Паскале (Unit), его назначение, структура модуля, назначение и описание частей модуля.

14
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
26.02.2012, 10:21
Цитата Сообщение от ТотКтоНадо Посмотреть сообщение
Тока никакого копирования я не вижу
Не видишь где? Скомпилируй и запусти пример в отладчике и увидишь что знаковый бит распространяется в dx в случае cwd и в старшую половину eax в случае cwde

Цитата Сообщение от ТотКтоНадо Посмотреть сообщение
Рассажите назначение этой команды
обычно используется перед знаковым делением
0
 Аватар для ТотКтоНадо
-8 / 1 / 0
Регистрация: 11.12.2011
Сообщений: 364
26.02.2012, 12:17  [ТС]
Цитата Сообщение от vital792 Посмотреть сообщение
Не видишь где? Скомпилируй и запусти пример в отладчике и увидишь что знаковый бит распространяется в dx в случае cwd и в старшую половину eax в случае cwde
а если значение регистра eax 0000b7c1 то почему в edx выскакивает 0000ffff?
и при cwde выскакивает в eax ffffb7c1?
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
26.02.2012, 12:45
Цитата Сообщение от ТотКтоНадо Посмотреть сообщение
значение регистра eax 0000b7c1 то почему в edx выскакивает 0000ffff?
и при cwde выскакивает в eax ffffb7c1?
cwd. Копируются значения старшего бита регистра ax во все биты регистра dx Надеюсь не надо объяснять, что ax - младшая чвсть регистра eax, а с dx младшая часть edx...
0
 Аватар для ТотКтоНадо
-8 / 1 / 0
Регистрация: 11.12.2011
Сообщений: 364
26.02.2012, 12:50  [ТС]
Цитата Сообщение от vital792 Посмотреть сообщение
cwd. Копируются значения старшего бита регистра ax во все биты регистра dx Надеюсь не надо объяснять, что ax - младшая чвсть регистра eax, а с dx младшая часть edx...
слушай еще вопрос с делением
код
Code
1
2
3
4
5
6
7
8
begin
  asm
    mov eax,0 поместили число 0 в eax
    mov edx,255 поместили число 255 в edx
    mov ebx,3 поместили число 3 ebx
    div ebx делим edx на ebx
  end;
end;
числа должны выскачить в eax 55 но деления как будто нету числа так и остались в eax 0 в edx ff
что за фигня?
0
85 / 85 / 38
Регистрация: 09.12.2011
Сообщений: 174
26.02.2012, 13:54
Потому что FF 00 00 00 00 / 3 не помещается в регистр.
0
 Аватар для ТотКтоНадо
-8 / 1 / 0
Регистрация: 11.12.2011
Сообщений: 364
26.02.2012, 16:40  [ТС]
Цитата Сообщение от zhan313 Посмотреть сообщение
Потому что FF 00 00 00 00 / 3 не помещается в регистр.
всмысле как это не помещаеться?
и можт 00 00 00 00 FF ? ине 00 00 00 00 FF а 00 00 00 FF. Так конечно она в регистр не поместяться.
Я что то не допонимаю вас
---------------------------
Project1
---------------------------
Integer overflow.
---------------------------
ОК
---------------------------
какое еще числовое переполнение
0
85 / 85 / 38
Регистрация: 09.12.2011
Сообщений: 174
26.02.2012, 16:45
Вот для кого книжки пишут ? (В частности Питер Абель, АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC)
Code
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
                        Переполнения и прерывания
                       ---------------------------
     Используя  команды  DIV  и  особенно  IDIV,  очень  просто    вызвать
пеpеполнение. Прерывания приводят (по крайней мара в системе, используемой
при тестировании этих программ) к непредсказуемым результатам. В операциях
деления предполагается,  что  частное  значительно  меньше,  чем  делимое.
Деление на ноль всегда вызывает прерывание.  Но деление  на  1  генерирует
частное, которое равно делимому, что может также легко вызвать прерывание.
     Рекомендуется использовать следующее правило: если делитель  -  байт,
то его значение должно быть меньше, чем левый  байт  (AH)  делителя:  если
делитель - слово, то его значение должно быть меньше, чем левое слово (DX)
делителя. Проиллюстрируем данное правило для делителя, равного 1:
 
          Операция деления:          Делимое   Делитель  Частное
 
          Слово на байт:                0123        01     (1)23
          Двойное слово на слово:  0001 4026      0001   (1)4026
 
В обоих  случаях  частное  превышает  возможный  размер.  Для  того  чтобы
избежать подобных ситуаций, полезно вставлять перед командами DIV  и  IDIV
соответствующую проверку.  В первом из следующих примеpов предположим, что
DIVBYTE - однобайтовый делитель, а делимое находится уже в регистре AX. Во
втором примере предположим, что DIVWORD - двухбайтовый делитель, а делимое
находится в регистровой паре DX:AX.
 
               Слово на байт            Двойное слово на байт
 
               CMP  AH,DIVBYTE          CMP  DX,DIVWORD
               JNB  переполнение        JNB  переполнение
               DIV  DIVBYTE             DIV  DIVWORD
 
     Для команды IDIV данная логика должна учитывать тот  факт,  что  либо
делимое, либо делитель могут быть отрицательными, а так  как  сравниваются
абсолютные значения, то необходимо использовать команду NEG для временного
перевода отрицательного значения в положительное.
0
 Аватар для ТотКтоНадо
-8 / 1 / 0
Регистрация: 11.12.2011
Сообщений: 364
26.02.2012, 17:12  [ТС]
Цитата Сообщение от zhan313 Посмотреть сообщение
Переполнения и прерывания --------------------------- Используя команды DIV и особенно IDIV, очень просто вызвать пеpеполнение. Прерывания приводят (по крайней мара в системе, используемой при тестировании этих программ) к непредсказуемым результатам. В операциях деления предполагается, что частное значительно меньше, чем делимое. Деление на ноль всегда вызывает прерывание. Но деление на 1 генерирует частное, которое равно делимому, что может также легко вызвать прерывание. Рекомендуется использовать следующее правило: если делитель - байт, то его значение должно быть меньше, чем левый байт (AH) делителя: если делитель - слово, то его значение должно быть меньше, чем левое слово (DX) делителя. Проиллюстрируем данное правило для делителя, равного 1: Операция деления: Делимое Делитель Частное Слово на байт: 0123 01 (1)23 Двойное слово на слово: 0001 4026 0001 (1)4026 В обоих случаях частное превышает возможный размер. Для того чтобы избежать подобных ситуаций, полезно вставлять перед командами DIV и IDIV соответствующую проверку. В первом из следующих примеpов предположим, что DIVBYTE - однобайтовый делитель, а делимое находится уже в регистре AX. Во втором примере предположим, что DIVWORD - двухбайтовый делитель, а делимое находится в регистровой паре DX:AX. Слово на байт Двойное слово на байт CMP AH,DIVBYTE CMP DX,DIVWORD JNB переполнение JNB переполнение DIV DIVBYTE DIV DIVWORD Для команды IDIV данная логика должна учитывать тот факт, что либо делимое, либо делитель могут быть отрицательными, а так как сравниваются абсолютные значения, то необходимо использовать команду NEG для временного перевода отрицательного значения в положительное.
какую еще проверку делать?
У меня делимое меньше чем частное но переывания возникают
на ноль я неделю и на 1 тоже
Code
1
2
3
4
5
6
7
8
begin
  asm
    mov eax,0
    mov edx,1879048191
    mov bl,3
    div bl
  end;
end;
я вас все же непонимаю
0
 Аватар для ТотКтоНадо
-8 / 1 / 0
Регистрация: 11.12.2011
Сообщений: 364
27.02.2012, 20:45  [ТС]
Цитата Сообщение от zhan313 Посмотреть сообщение
Вот для кого книжки пишут ? (В частности Питер Абель, АССЕМБЛЕР И ПРОГРАММИРОВАНИЕ ДЛЯ IBM PC) Код 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 Переполнения и прерывания --------------------------- Используя команды DIV и особенно IDIV, очень просто вызвать пеpеполнение. Прерывания приводят (по крайней мара в системе, используемой при тестировании этих программ) к непредсказуемым результатам. В операциях деления предполагается, что частное значительно меньше, чем делимое. Деление на ноль всегда вызывает прерывание. Но деление на 1 генерирует частное, которое равно делимому, что может также легко вызвать прерывание. Рекомендуется использовать следующее правило: если делитель - байт, то его значение должно быть меньше, чем левый байт (AH) делителя: если делитель - слово, то его значение должно быть меньше, чем левое слово (DX) делителя. Проиллюстрируем данное правило для делителя, равного 1: Операция деления: Делимое Делитель Частное Слово на байт: 0123 01 (1)23 Двойное слово на слово: 0001 4026 0001 (1)4026 В обоих случаях частное превышает возможный размер. Для того чтобы избежать подобных ситуаций, полезно вставлять перед командами DIV и IDIV соответствующую проверку. В первом из следующих примеpов предположим, что DIVBYTE - однобайтовый делитель, а делимое находится уже в регистре AX. Во втором примере предположим, что DIVWORD - двухбайтовый делитель, а делимое находится в регистровой паре DX:AX. Слово на байт Двойное слово на байт CMP AH,DIVBYTE CMP DX,DIVWORD JNB переполнение JNB переполнение DIV DIVBYTE DIV DIVWORD Для команды IDIV данная логика должна учитывать тот факт, что либо делимое, либо делитель могут быть отрицательными, а так как сравниваются абсолютные значения, то необходимо использовать команду NEG для временного перевода отрицательного значения в положительное.
при коде
Code
1
2
3
4
5
6
7
8
begin
  asm
    mov dx,0
    mov ax,16383
    mov bx,2
    div bx
  end;
end;
а при коде вызывает перерывание
Code
1
2
3
4
5
6
7
8
begin
  asm
    mov eax,0
    mov edx,1073741823
    mov ebx,2
    div ebx
  end;
end;
разница же ведь только в том что в первом коде регистры и числа 16 разрядные а вот втором коде 32 разрядные числа и регистры. По идее же никакого перывания не должно произойти тк на ноль и на 1 я не делю и делимое меньше чем частное. Я полностью удавлетворяю правилам но прерывания происходят. Что не так?
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
28.02.2012, 12:05
ТотКтоНадо, у тебя в eax:edx число очень большое, 62 бита, которое ты делишь на 2 т.е. результат будет 61 бит, в какой регистр такое число можно записать?
Естественно будет переполнение. Скорее всего, ты допустил логическую ошибку и перепутал eax и edx местами.
0
 Аватар для ТотКтоНадо
-8 / 1 / 0
Регистрация: 11.12.2011
Сообщений: 364
28.02.2012, 16:14  [ТС]
Цитата Сообщение от x128 Посмотреть сообщение
перепутал eax и edx местами.
ты посмотри какой бздюк http://asmworld.ru/spravochnik-komand/div/
да еще и спрашивается почему у меня переполнение возникает
0
240 / 218 / 46
Регистрация: 17.04.2010
Сообщений: 526
28.02.2012, 16:26
В твоем случае (деление двойного слова на двойное слово), нужно было использовать cdq:
Assembler
1
2
3
4
mov  ebx, делитель
mov  eax, делимое
cdq
div  ebx
0
2014 / 1286 / 61
Регистрация: 05.06.2010
Сообщений: 2,213
28.02.2012, 21:01
ТотКтоНадо, всегда нужно критически относиться к непроверенным источникам. Доверяй, но проверяй, а вообще скачай лучше книжку по ассемблеру)

x128, вместо cdq, пожалуй правильнее будет xor edx, edx
0
Ушел с форума
Автор FAQ
 Аватар для Mikl___
16371 / 7683 / 1080
Регистрация: 11.11.2010
Сообщений: 13,757
29.02.2012, 07:04
ТотКтоНадо, команды cbw, cwd, cdq тут не причем читай выделенное красным
Переполнения и прерывания
---------------------------
Используя команды DIV и особенно IDIV, очень просто вызвать переполнение. В операциях деления предполагается, что частное меньше, чем делимое. Деление на ноль всегда вызывает прерывание. При делении на 1 получим частное, которое равно делимому, что также вызовет прерывание INT 0.
Рекомендуется использовать следующее правило: если делитель - байт, то его значение должно быть больше, чем левый байт (AH) делимого: если делитель - слово, то его значение должно быть больше, чем содержимое (DX)
во времена Абеля не было 32-/64-разрядных процессоров, но правило распространяется и на них
если делитель - двойное слово, то его значение должно быть больше, чем содержимое (EDX) делимого: если делитель - четверное слово, то его значение должно быть больше, чем содержимое (RDX)
теперь смотрим твою программу
begin
asm
mov eax,0; поместили число 0 в eax
mov edx,255; поместили число 255 в edx
mov ebx,3; поместили число 3 ebx
div ebx; делим edx:eax на ebx
end;
end;
3 < 255 (ebx < edx) поэтому переполнение при делении будет обеспечено

PS хотя команды div ah/idiv ah/div dx/idiv dx/div edx/idiv edx существуют, но их использование всегда приведет к появлению сообщения "деление на ноль" при любом содержимом ah/dx/edx
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.02.2012, 07:04
Помогаю со студенческими работами здесь

Добрый день. Вероятность того что команда а и команда б забьет 2,3,4,5 голов
Команда а, сыграла дома 12 матчей забила 17 мячей и пропустила 7 Команда б, сыграла в гостях 12 матчей забила 11 мячей и пропустила 16 ...

Почему команда «dir>test.txt» работает, а команда «ftp /?>test.txt» — нет?
Пробовала без пробелов, что тут еще можно попробовать непонятно Выводит в окно командной строки. Как исправить?

Обработка прерывания "ошибочная команда" или "неверная команда"
Привет форумчани! Очень нужна ваша помощь... Нужно написать программу, которая будит сообщать о том, что в задаче используется неверная...

Назначение FK
Здравствуйте. Только начал изучать SQL, так что прошу прощения за глупый вопрос. Создание таблиц: CREATE TABLE ( NUMERIC NOT...

Назначение транзистора
Недавно задался вопросом для чего нужен транзистор.Всегда считал что транзистор нужен для перевода тока из переменного в постоянный(Так же...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru